(1) Javaでカンマやクォーテーションをエスケープする方法
(1-1) 実現方法・構文
(1-2) サンプルプログラム
(1-3) 参考:カンマとダブルクォーテーション両方のエスケープが必要な理由
(1) Javaでカンマやクォーテーションをエスケープする方法
JavaのStringにおいてカンマやクォーテーションをエスケープする方法をご紹介します。
何もエスケープしないと、出力は次のようにdefとghiの間のカンマ「,」がセパレータとして動作してしまい、次のようになります。
(図101)
これをエスケープ処理をする事により、次のように1つのセルに収める方法をご紹介します。
(図102)
(1-1) 実現方法・構文
対応としては以下の2種類の記号をエスケープ処理します。
①カンマ「,」のエスケープ
②ダブルクォーテーション「”」のエスケープ
これを行う事で、ダブルクォーテーション「”」もカンマ「,」も区切り文字ではなく、「文字列の一部」として扱われるようになります。
①カンマ「,」のエスケープ
- if(str.contains(",")) {str = "\""+str+"\"";}
②ダブルクォーテーション「”」のエスケープ
- if(str.contains("\"")) {str = str.replace("\"", "\"\"");}
(1-2) サンプルプログラム
今回は簡単なサーブレットを用意し、サーブレットのURLを呼び出すとcsvファイルがダウンロードされるような仕組みにします。
この仕組み自体は今回のテーマから外れるので深くは触れませんが、興味ある方は下記も併せてご参照ください。
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- @WebServlet("/IT0992_EscapeComma")
- public class IT0992_EscapeComma extends HttpServlet {
- private static final long serialVersionUID = 1L;
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //# csv出力準備(エンコーディング方式、出力時ファイル名の指定)
- String filename = "sample.csv";
- response.setHeader("Content-Type", "text/csv; charset=UTF-8");
- response.setHeader("Content-Disposition", "attachment; filename=\""+filename+"\"");
- PrintWriter out = response.getWriter();
- //# ▲csv出力文言の設定(今回のテーマに関連する記述)
- //# ①[\']クォーテーション:Stringの先頭にあると、csv上で表示されなくなってまう)
- //# ②[,]カンマ:String中にあると、csv上で別セルに分かれてしまう)
- //# テスト文字列:"abc [①クォーテーション] def [②カンマ] ghi"
- String str = "abc \" def , ghi";
- //# ▲エスケープ処理&改行除去
- //# ①[\']クォーテーションのエスケープ
- if(str.contains("\"")) {str = str.replace("\"", "\"\"");}
- //# ②[,]カンマのエスケープ
- if(str.contains(",")) {str = "\""+str+"\"";}
- out.append(str);
- }
- }
(1-3) 参考:カンマとダブルクォーテーション両方のエスケープが必要な理由
この記事を読んで、カンマさえエスケープすればcsvでセルが分かれるのを防げるのでは?と思われた方もいるかも知れません(ダブルクォーテーションのエスケープの必要性が不明瞭)。
(表)
ダブルクォーテーション エスケープ |
カンマ エスケープ |
|
パターン① | ×(なし) | ×(なし) |
パターン② | ×(なし) | ○(あり) |
パターン③ | ○(あり) | ×(なし) |
パターン④ | ○(あり) | ○(あり) |
・パターン①
(図131)
・パターン②
(図132)
・パターン③
(図133)
・パターン④
(図134)