字符串的csv分离

时间:2012-01-26 21:38:32

标签: java csv

  

可能重复:
  CSV parsing in Java - working example..?

我有"Name",16,"Canada"格式的姓名,年龄和国家/地区列表,有些是"First, Second",21,"Canada"我如何分开这些?

我一直在使用.split,但无法让它适用于这些格式的字符串。

3 个答案:

答案 0 :(得分:0)

我正在使用Java CSV LIbrary这有两个类一个读取,另一个写csv可以处理引用的字符串。

答案 1 :(得分:0)

我会使用OpenCSV并执行以下操作:

CSVReader reader = new CSVReader(new FileReader("yourfile.csv"));
String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
    // nextLine[] is an array of values from the line        
}

答案 2 :(得分:0)

有可能的库可以为您做到这一点(参见前面的答案)。 但是,如果要手动编写代码,则需要自己构建一个有限状态机,并独立检查字符串中的每个字符,以确定是否属于引号。您基本上需要两种状态 - IN_QUOTE,NO_QUOTE - 因为检查规则因您的状态而异。如果您在引号内,则要忽略逗号。如果您在引号之外,则需要用逗号分隔字段。

我的头顶上的Psuedo代码看起来像是:

String line = <input string>
List<String>fields = new ArrayList<String>();
StringBuffer field = new StringBuffer();
for( int i = 0 ; i < line.length(); i++){
   char c = line.charAt(i);
   switch( state ){
      NO_QUOTE:
         // check if character is a quote or a comma.  If neither append character to field
         if( quote )  
            // change state
            state = IN_QUOTES;
         else if( comman )
            // close the field and start a new one
            fields.add(field.toString());
            field = new StringBuffer();
         else
            field.append(c);
         break;

      IN_QUOTES:
         // only search for a closed quote mark
         if( quote )  
            // change state
            state = OUT_QUOTES;
         else
            field.append(c);
   }

所有这一切,你的考试规则可能变得过于棘手和复杂(你需要检查逃脱的引号吗?UTF-8或其他字符集怎么样?等等)并且可能不值得你努力重新发明轮子时,其他几个lib似乎已经为你做了这项工作。