带选项卡的CSV作为引号字符

时间:2016-06-21 23:35:28

标签: java csv

我已经为Java尝试了几个CSV解析器,但是没有正确处理以下行:

String str = "\tvalue1\t,,\tv1,",',v3\t,value2"

格式为逗号,以TAB分隔为转义字符。部分字段为空,部分字段未转义。

解析器处理这种格式的任何建议都很好吗?

例如,我希望上面的字符串将被解析为:

value1
null
v1,",',v3
value2

但它产生了以下内容:

value1
 null
 v1
 "
 '
 v3
 value2

Java示例:

import java.lang.String;
import com.univocity.parsers.csv.CsvParser;
import com.univocity.parsers.csv.CsvParserSettings;

public class StamMain {

    public static void main(String[] args){
        String str = "\tvalue1\t,,\tv1,',",v3\t,value2";
        System.out.println(str);
        CsvParserSettings settings = new CsvParserSettings();
        settings.getFormat().setQuote('\t');
        CsvParser parser = new CsvParser(settings);
        String[] fields = parser.parseLine(str);
        for (String f : fields)
            System.out.println(f);
    }
}

如果用引号代替TAB,取得了最好的结果,但引用引号本身就是一项有趣的任务。

任何想法都赞赏。

5 个答案:

答案 0 :(得分:3)

Apache Commons CSV可以处理它。

public static String swap(String x,int a,int b){
    char list[]=x.toCharArray();
    char tmp=x.charAt(a);
    list[a]=list[b];
    list[b]=tmp;
    return new String(list);
}
public static void perm(String x,String base){
    if(base.length()==3)
        System.out.println(base);
    for(int i=0;i<x.length();i++)
        for(int j=i;j<x.length();j++){
            String tmp=swap(x,i,j);
            perm(tmp.substring(1),base+tmp.charAt(0));
        }
}

输出

String str = "\tvalue1\t,,\tv1,\",',v3\t,value2";
CSVFormat csvFormat = CSVFormat.DEFAULT.withQuote('\t');
for (CSVRecord record : CSVParser.parse(str, csvFormat))
    for (String value : record)
        System.out.println(value);

如果需要,您甚至可以添加value1 v1,",',v3 value2 来获取该空值。

.withNullString("")

非常灵活的CSV解析器。

答案 1 :(得分:2)

适用于Super CSV

ICsvListReader reader = new CsvListReader(
    new FileReader("weird.csv"), 
    CsvPreference.Builder('\t', ',', "\r\n").build() 
);

List<String> record = reader.read();

for(String value : record)
  System.out.println(value);

输出:

value1
null
v1,",',v3
value2

答案 2 :(得分:1)

只需在解析之前添加此行以获得您期望的结果:

settings.trimValues(false);

这是必需的,因为默认情况下,解析器会删除分隔符周围的空白区域,但是&#34;引用&#34;角色碰巧是一个白色的空间。无论如何,解析器应该处理这个问题。我打开this bug report以便在下一版本的uniVocity解析器中修复它。

答案 3 :(得分:0)

一种选择是:

1)用一些&#34; good&#34;替换你的字符串中的所有双引号。您知道的替换字符串不会出现在实际数据中(例如&#34; REPLACE_QUOTES_TEMP&#34;)

2)用双引号替换所有标签。

3)正常运行解析器。

4)替换&#34; REPLACE_QUOTES_TEMP&#34;字符串(或您选择的任何字符串),在单个字段中,带有实际的双引号。

答案 4 :(得分:-2)

字符串“\ tvalue1 \ t \ t,\ tv1,”,“,v3 \ t,value2”无效。要包含“\ n”作为您需要编写的字符'\“'。

对于解析此代码应该有效:

String st =“\ tvalue1 \ t ,, \ tv1,\”,',v3 \ t,value2“;

String [] arr = st.split(“\ t”);