Java/CSV

Last-modified: 2013-02-07 (木) 10:33:39
 public static List<String> parseCSV(String line) {

     final List<String> list = new ArrayList<String>();

     int charCnt = 0;
     int charIdx = 0;

     final StringBuilder builder = new StringBuilder();
     while (charCnt < line.length()) {

         final boolean isDoubleQuote = line.substring(charCnt, charCnt + 1).equals("\"");

         if (isDoubleQuote) {
             ++charCnt;
         }

         charIdx = line.indexOf(isDoubleQuote ? "\"" : ",", charCnt);

         if (charIdx < 0) {
             charIdx = line.length();
         }

         final String workStr = line.substring(charCnt, charIdx);

         if (isDoubleQuote && charIdx < line.length() - 1
                 && line.substring(charIdx + 1, charIdx + 2).equals("\"")) {
             // 文字列内のクォートと判断
             builder.append(workStr);
             builder.append("\"");
             charCnt = charIdx + 1;

         } else {
             list.add(builder.toString() + workStr);
             builder.setLength(0);
             charCnt = charIdx + (isDoubleQuote ? 2 : 1);
         }

         // 最後の文字が"SEPARATOR" modify:2008.04.16
         if (line.length() == charCnt) {
             final String lastStr = line.substring(charCnt - 1, charCnt);
             if (lastStr.equals(",")) {
                 list.add("");
             }

         }
     }
 }