我有一个程序可以读取由制表符分隔的CSV文件。我在我的程序中按\ t分割,直到有人在其中一个列中添加了一个选项卡,现在它正在拆分太多列。
在下面的示例中,您可以看到“测试代码”列在单词代码后面有一个选项卡。当我使用br.readline()读取此行时,想知道是否有办法摆脱该选项卡,因此“测试代码”变为“测试代码” ,我会想为我读过的每一行做这个,基本上用双引号括起来的叮咬去掉任何标签。
“40198”“DD40198”“4 - 正常“”DRAFT“”“”ABEND“”X10“”未分配“”9月12日, 2016 2:49 PM“”“”“”“”测试代码 “”0“”0“”“”9X999,999,000“”false“”false“”false“”false“”false“”false“”false“”“”“5740XYR00”“”“”“未分配”“”“ “”9999999“”“”未分配“
for (;;) {
line = br.readLine();
if (line == null)
break;
//would like to add code here to strip the tab spaces out of strings inside double quotes
String[] fields = line.split("\t");
答案 0 :(得分:0)
你正在经历许多人以前做过的经历;那就是:一旦遇到你没想到的输入,就会自写CSV解析器中断。
事情是:将对所有有效 CVS输入都很健壮的正确 CSV解析器整合在一起是硬任务。
所以,我的建议是回到这里并考虑一些完全不同的东西:而不是按摩意外的输入以符合你的CSV想法;尝试使用执行CSV解析的现有第三方库。
换句话说:这个轮子已经发明了很多次。只需采用现有的,工作的,坚固的车轮,而不是再次发明它。也许它需要一些时间来完成工作,但很可能不继续使用你自己的解析器很快得到回报。
答案 1 :(得分:0)
你可以从像这样的引号中删除额外的标签
StringBuilder sb = new StringBuilder();
boolean inQuotes = false;
for(char c : line.toCharArray()) {
if(c == '"') {
inQuotes = !inQuotes;
}
if(inQuotes && c == '\t') {
continue;
}
sb.append(c);
}
String[] fields = sb.toString().split("\t");
答案 2 :(得分:0)
对于您的问题,没有直接的方法可以做到这一点。您需要一个自定义方法来实现。在这里,我将为您解决问题。只需调用下面的方法,并根据您的要求将字符串转换为有效的字符串(在<#>;#t;&#34之前将字符串拆分为<#34;&#34;之前将包含选项卡) ; 强>
public String convertValidString(String s){
StringBuilder sb = new StringBuilder(s);
int c = 0;
for (int i=0;i<sb.length();i++){
if (c !=2 && sb.charAt(i)=='\t'){
sb.deleteCharAt(i);
}
if (sb.charAt(i) == '"'){
c = c==2 ? 0 : c+1;
}
}
return sb.toString();
}
上述方法将删除&#34;&#34; 内的标签。所以你需要调用上面的方法来转换你的字符串,然后再分割&#34; \ t&#34; 。