1. Top
  2. Java Tips
  3. 正規表現

Javaの正規表現でカンマ区切りCSVファイルを分割する

CSVファイルの仕様
1、区切り文字:カンマ「,」
2、値にカンマ「,」を含む場合は,値の前後をダブルクオート「"」で囲う
3、値にダブルクオート「"」を含む場合は,2つのダブルクオートに置換する「""」



正規表現で分割する方法
1、「"」で囲まれていない「,」で行を分割する。 2、分割後の文字列に、最初と最後に「"」があれば削除する。 3、エスケープされた「"」を戻す。


Javaの正規表現でカンマ区切りCSVファイルを分割する

テスト文字列:天然水晶 パワーストーン,1,000円,オニキス パワーストーン,半額で"500円",本日限り!
CSV文字列:天然水晶 パワーストーン,"1,000円",オニキス パワーストーン,"半額で""500円"",本日限り!"

【正規表現でCSVデータ分割クラス】
package test.regex;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author livetp.com
 */
public class ParseCsv {
    
    /** 後ろに偶数個の「"」が現れる「,」にマッチする正規表現 */
    static final String REGEX_CSV_COMMA = ",(?=(([^\"]*\"){2})*[^\"]*$)";  
        
    /** 最初と最後の「"」にマッチする正規表現*/
    static final String REGEX_SURROUND_DOUBLEQUATATION = "^\"|\"$";  
    
    /** 「""」にマッチする正規表現 */
    static final String REGEX_DOUBLEQUOATATION = "\"\"";  

    public static void main(String[] args) {

        // CSVデータ
        String str = "天然水晶 パワーストーン,\"1,000円\",オニキス " +
                "パワーストーン,\"半額で\"\"500円\"\",本日限り!\"";
        
        // 正規表現で分割する
        String[] tmp = splitLineWithComma(str);
        
        for (int i=0; i < tmp.length; i++) {
            System.out.println(tmp[i]);
        }
    }
    
    /** 
     * カンマ区切りで行を分割し、文字列配列を返す。
     * 
     * ※下記について、アンエスケープ後の文字列を返す。
     * 1. 値にカンマ(,)を含む場合は,値の前後をダブルクオート(")で囲う
     * 2. ダブルクオート(")は,2つのダブルクオートに置換する("")
     * 
     * */ 
    private static String[] splitLineWithComma(String line) {
        // 分割後の文字列配列
        String[] arr = null;

        try {
            // 1、「"」で囲まれていない「,」で行を分割する。
            Pattern cPattern = Pattern.compile(REGEX_CSV_COMMA); 
            String[] cols = cPattern.split(line, -1);  
            
            arr = new String[cols.length];  
            for (int i = 0, len = cols.length; i < len; i++) {  
                String col = cols[i].trim();  
                
                // 2、最初と最後に「"」があれば削除する。
                Pattern sdqPattern = 
                    Pattern.compile(REGEX_SURROUND_DOUBLEQUATATION); 
                Matcher matcher = sdqPattern.matcher(col);  
                col = matcher.replaceAll("");  
     
                // 3、エスケープされた「"」を戻す。 
                Pattern dqPattern = 
                    Pattern.compile(REGEX_DOUBLEQUOATATION); 
                matcher = dqPattern.matcher(col);  
                col = matcher.replaceAll("\"");  
                
                arr[i] = col;  
            }
        } catch (Exception e) {
            e.printStackTrace();
        } 
        
        return arr;  
    }
}


【実行結果】
天然水晶 パワーストーン
1,000円
オニキス パワーストーン
半額で"500円",本日限り!

http://livetp.com


ページの先頭へ