Free lancer’s blog

フリーランス活動に関する記録を記して行こうと思います。

Java 版 CSV パーサ (ダブルクォーテーション対応)

CSV に何のこだわりがあるかわかりませんが、今回は Java バージョンです。
デフォルトのパーサが見当たりませんでしたので、自作しました。

package file;

import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;

import java.util.regex.Pattern;
import java.util.ArrayList;

import java.io.FileNotFoundException;
import java.io.IOException;
import gadgets.Debug;

public class CSVParser {
	public static String[][] parse ( String filename ) {
		String[][] ret = null;
		ArrayList<String[]> tmp = new ArrayList<String[]>();
		String line;
		String[] row;
		int i = 0;
		Pattern pattern = Pattern.compile( "^\".*\"$" );
		
		try {
			BufferedReader br = new BufferedReader( new FileReader( new File( filename ) ) );
			
			while ( ( line = br.readLine() ) != null ) {
				row = line.split( ",(?=(([^\"]*\"){2})*[^\"]*$)", -1 );
				for ( i = 0; i < row.length; i ++ ) {
					if ( pattern.matcher( row[ i ] ).find() ) {
						row[ i ] = row[ i ].substring( 1, row[ i ].length() - 1 ).replace( "\"\"" , "\"" );
						System.out.println( row[ i ] );
						
					}
				}	
				tmp.add( row );
			}
			
			ret = new String[ tmp.size() ][];
			for ( i = 0; i < tmp.size(); i ++ ) {
				ret[ i ] = tmp.get( i );
			}
			
			br.close();
		} catch ( FileNotFoundException e ) {
			Debug.exit( filename + " is not found." );
		} catch ( IOException e ) {
			Debug.exit( "faild in read " + filename );
		}
		
		return ret;
	}
}