2010-02-11 39 views
2

我已将字符串"MO""RET"存储在items[1]数组中。在它被存储之后,我对这个字符串做一个替换,它将替换所有的双引号。 但我希望它被存储为MO"RET。我该怎么做。在我使用split命令处理的csv文件中重复出现在Text字段内容中的双引号(例如:这个帐号是""large""之一)所以我想保留字符串中间的两个引号之一if它得到的重复而忽略了结束引号如果存在的话我该怎么办呢关于Java字符串操作

String items[] = line.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)"); 
items[1] has "MO""RET" 
String recordType = items[1].replaceAll("\"",""); 

在此之后RECORDTYPE有MORET我希望它有MO"RET

+4

不到一个小时前你发布了一个非常类似的问题http://stackoverflow.com/questions/2241758/regarding-java-split-command-parsing-csv-file你没有回应,下来或upvoted ,或接受。如果你不回馈网站,人们会停止给你。 – 2010-02-11 02:56:43

+1

@Mark Byers:哦,我真希望那是真的。 – danben 2010-02-11 03:17:29

回答

1

怎么样。?

String recordType = items[1].replaceAll("\"\"", "\""); 
+0

非常感谢。如果我的字符串的值是“TEST”REPLA“如果在字符串中间只有一个双引号,我怎样才能删除第一个,最后一个引号并保留所有的中间引号我想输出作为测试“REPLA 示例2:”EXAM“PLE”2IN“我希望输出为EXAM”PLE“2IN需要删除第一个和最后一个引号 – Arav 2010-02-11 04:57:42

+0

使用正则表达式很难做到这一点,并且覆盖有一个开始报价和没有结束报价等。而正则表达式开始变得非常复杂。你真的开始更好地解析整条线。如果你真的只想要特定的开始/结束引用的情况下,然后检查这与charAt()并做一个子字符串。无论如何,它将比正则表达式更快。 – PSpeed 2010-02-11 08:30:22

6

唐不使用正则表达式o分割一个CSV行。这是要求麻烦;)只是逐字符地解析它。这里有一个例子:

public static List<List<String>> parseCsv(InputStream input, char separator) throws IOException { 
    BufferedReader reader = null; 
    List<List<String>> csv = new ArrayList<List<String>>(); 
    try { 
     reader = new BufferedReader(new InputStreamReader(input, "UTF-8")); 
     for (String record; (record = reader.readLine()) != null;) { 
      boolean quoted = false; 
      StringBuilder fieldBuilder = new StringBuilder(); 
      List<String> fields = new ArrayList<String>(); 
      for (int i = 0; i < record.length(); i++) { 
       char c = record.charAt(i); 
       fieldBuilder.append(c); 
       if (c == '"') { 
        quoted = !quoted; 
       } 
       if ((!quoted && c == separator) || i + 1 == record.length()) { 
        fields.add(fieldBuilder.toString().replaceAll(separator + "$", "") 
         .replaceAll("^\"|\"$", "").replace("\"\"", "\"").trim()); 
        fieldBuilder = new StringBuilder(); 
       } 
       if (c == separator && i + 1 == record.length()) { 
        fields.add(""); 
       } 
      } 
      csv.add(fields); 
     } 
    } finally { 
     if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} 
    } 
    return csv; 
} 

是的,有一点正则表达式参与,但它只剪掉结束隔膜和周围的单个字段的行情走势。

然而,您也可以抓取任何第三方Java CSV API

+0

非常感谢。非常感谢。如果我的字符串的值为“TEST”REPLA“。如果在字符串中间只有一个双引号,我该如何删除第一个,最后一个引号并保留所有中间引号。我想输出作为测试“REPLA 示例2:”EXAM“PLE”2IN“我希望输出为EXAM”PLE“2IN第一个和最后一个引号需要删除 – Arav 2010-02-11 04:55:48

+1

发布的代码示例已经这样做(假设您的CSV文件符合RFC4180,详见http://www.rfc-editor.org/rfc/rfc4180.txt)。 – BalusC 2010-02-11 13:11:09

+0

我用过你的代码。太棒了!嗯......有一点问题,我期待'[“ A“,”B“,”“,”]]'从电子表格中导出的文件的'A,B''行,但是我得到了'[“A”,“B”,“”]' – 2013-01-17 07:21:06

0

我更喜欢你使用replace而不是replaceAll。 replaceAll使用REGEX作为第一个参数。

要求是替代两个继续报价时,一个QUOTE

String recordType = items[1].replace("\"\"", "\""); 

要查看更换和的replaceAll之间的差异,执行娄代码

recordType = items[1].replace("$$", "$"); 
recordType = items[1].replaceAll("$$", "$"); 
+0

非常感谢,如果我的字符串的值是“TEST”REPLA“。如果在字符串中间只有一个双引号,我该如何删除第一个,最后一个引号并保留所有中间引号。我想输出作为测试“REPLA 示例2:”EXAM“PLE”2IN“我想输出为EXAM”PLE“2IN需要删除第一个和最后一个引号 – Arav 2010-02-11 04:52:07

0

在这里,您可以使用正则表达式。

recordType = items[1].replaceAll("\\B\"", ""); 
recordType = recordType.replaceAll("\"\\B", ""); 

第一条语句用空字符替换单词开头的引号。 第二条语句用空字符替换单词末尾的引号。