我已经为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,取得了最好的结果,但引用引号本身就是一项有趣的任务。
任何想法都赞赏。
答案 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”);