仅在java中,带双引号内的制表符/空格

仅在java中,带双引号内的制表符/空格,java,csv,tabs,Java,Csv,Tabs,我有一个程序,可以读取由tab分隔的CSV文件。我在我的程序中按\t进行拆分,该程序在有人在其中一列中添加选项卡之前一直在运行,现在它拆分了太多的一列 在下面的示例中,您可以看到“测试代码”列在单词code之后有一个选项卡。当我使用br.readline()阅读这一行时,我想知道是否有办法去掉该选项卡,使“测试代码”变为“测试代码”,我想对我阅读的每一行执行此操作,基本上将所有选项卡从包含在双引号中的stings中去掉 “40198”“DD40198”“4- 9月12日正常“草稿”异常结束“X1

我有一个程序,可以读取由tab分隔的CSV文件。我在我的程序中按\t进行拆分,该程序在有人在其中一列中添加选项卡之前一直在运行,现在它拆分了太多的一列

在下面的示例中,您可以看到“测试代码”列在单词code之后有一个选项卡。当我使用br.readline()阅读这一行时,我想知道是否有办法去掉该选项卡,使“测试代码”变为“测试代码”,我想对我阅读的每一行执行此操作,基本上将所有选项卡从包含在双引号中的stings中去掉

“40198”“DD40198”“4- 9月12日正常“草稿”异常结束“X10”未分配, 2016年2:49 PM“”测试代码 “0”“0”“9X9999000”“false”“false”“false”“false”“false”“false”“5740XYR00”“未分配”“999999”“未分配”


你正在创造一种很多人都有过的体验;也就是说:自编CSV解析器在遇到您意想不到的输入时会立即中断

问题是:整合一个对各种有效CVS输入都很健壮的正确的CSV解析器是一项困难的任务

所以,我的建议是退一步来考虑一些完全不同的事情:而不是按摩意想不到的输入来匹配你的CSV理念;尝试使用执行CSV解析的现有第三方库


换句话说,这个轮子已经发明了很多次了。就拿一个现有的,可以工作的,坚固的轮子,而不是再重新发明一次。也许要花一些时间才能让这些东西正常工作,但很可能不会继续使用自己的解析器很快就会有回报

你正在创造一种很多人以前都有过的体验;也就是说:自编CSV解析器在遇到您意想不到的输入时会立即中断

问题是:整合一个对各种有效CVS输入都很健壮的正确的CSV解析器是一项困难的任务

所以,我的建议是退一步来考虑一些完全不同的事情:而不是按摩意想不到的输入来匹配你的CSV理念;尝试使用执行CSV解析的现有第三方库


换句话说,这个轮子已经发明了很多次了。就拿一个现有的,可以工作的,坚固的轮子,而不是再重新发明一次。也许要花一些时间才能让这些东西正常工作,但很可能不会继续使用自己的解析器很快就会有回报

你可以像这样从引号中去掉额外的标签

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");

你可以像这样从引号中去掉额外的标签

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");

对于你的问题,没有直接的方法可以做到这一点。您需要一个自定义方法来实现。这里我给你一个解决问题的方法。只需调用下面的方法,并根据您的要求将字符串转换为有效字符串(仅包含“”之外的制表符),然后按“\t”拆分字符串

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();
}
public String convertValidString(字符串s){
StringBuilder sb=新的StringBuilder;
int c=0;

对于(int i=0;i对于您的问题,没有直接的方法可以做到这一点。您需要一个自定义方法来实现。在这里,我为您提供了一个解决此问题的方法。只需调用下面的方法,并根据您的要求将字符串转换为有效的字符串(它将只包含“”之外的制表符),然后按“\t”拆分字符串

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();
}
public String convertValidString(字符串s){
StringBuilder sb=新的StringBuilder;
int c=0;
对于(int i=0;i