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