(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)
