4

次のようなcsvファイル(details.csv)があります

ID,NAME,ADDRESS
1,"{foo,bar}","{123,mainst,ny}"
2,"{abc,def}","{124,mainst,Va}"
3,"{pqr,xyz}","{125,mainst,IL}"

私が使用するとき(注:ディレクトリからすべてのcsvファイルを読み取るこの上に他のクロージャーがあります)

if(file.getName().equalsIgnoreCase("deatails.csv")) {
 input = new FileInputStream(file)
 reader = new BufferedReader(new InputStreamReader(input))
 reader.eachLine{line-> def cols = line.split(",")
 println cols.size() }

サイズ3を取得する代わりに、値で6を取得しています

1
"{foo
bar}"
"{123
mainst
ny}"

spilt(",") はコンマ(,) でデータを分割していますが、結果を

1
"{foo,bar}"
"{123,mainst,ny}"

この閉鎖を修正するにはどうすればよいですか。助けてください!ありがとう

4

2 に答える 2

21

csv パーサーの作成はトリッキーな作業です。

他の人に大変な作業を任せて、GroovyCsv のようなものを使用します。


GroovyCsvで解析する方法は次のとおりです

// I'm using Grab instead of just adding the jar and its
// dependencies to the classpath
@Grab( 'com.xlson.groovycsv:groovycsv:1.0' )
import com.xlson.groovycsv.CsvParser

def csv = '''ID,NAME,ADDRESS
1,"{foo,bar}","{123,mainst,ny}"
2,"{abc,def}","{124,mainst,Va}"
3,"{pqr,xyz}","{125,mainst,IL}"'''

def csva = CsvParser.parseCsv( csv )
csva.each {
  println it
}

どちらが印刷されますか:

ID: 1, NAME: {foo,bar}, ADDRESS: {123,mainst,ny}
ID: 2, NAME: {abc,def}, ADDRESS: {124,mainst,Va}
ID: 3, NAME: {pqr,xyz}, ADDRESS: {125,mainst,IL}

したがって、2 行目の NAME フィールドを取得するには、次のようにします。

def csvb = CsvParser.parseCsv( csv )
println csvb[ 1 ].NAME

どのプリント

{abc,def}

もちろん、CSV がファイルの場合は、次のことができます。

def csvc = new File( 'path/to/csv' ).withReader {
  CsvParser.parseCsv( it )
}

次に、上記のように使用します

于 2012-08-16T20:53:45.847 に答える
0

2 つの方法があります。1つは収集を使用しています

def processCsvData(Map csvDataMap, File file)
{

    InputStream inputFile = new FileInputStream(file);
    String[] lines = inputFile.text.split('\n')
    List<String[]> rows = lines.collect {it.split(',')}
          // Add processing logic
}

ここでの問題は、中括弧 ({}) の間のコンマを削除することです。つまり、"{foo,bar}" が "{foo bar}" になります Java を使用する別の方法で、これは問題なく動作します

public class CSVParser { 

    /* 
     * This Pattern will match on either quoted text or text between commas, including 
     * whitespace, and accounting for beginning and end of line. 
     */ 
    private final Pattern csvPattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?:,|$)");   
    private ArrayList<String> allMatches = null;         
    private Matcher matcher = null; 
    private int size; 

    public CSVParser() {                 
        allMatches = new ArrayList<String>(); 
        matcher = null; 
    } 

    public String[] parse(String csvLine) { 
        matcher = csvPattern.matcher(csvLine); 
        allMatches.clear(); 
        String match; 
        while (matcher.find()) { 
                match = matcher.group(1); 
                if (match!=null) { 
                        allMatches.add(match); 
                } 
                else { 
                        allMatches.add(matcher.group(2)); 
                } 
        } 

        size = allMatches.size();                
        if (size > 0) { 
                return allMatches.toArray(new String[size]); 
        } 
        else { 
                return new String[0]; 
        }                        
    }    

}

お役に立てれば!

于 2012-08-17T14:44:18.973 に答える