2016-09-13 21 views
1

我有一個程序讀取由製表符分隔的CSV文件。我在我的程序中分裂,這個程序一直在工作,直到有人在其中一列中添加了一個標籤,現在它正在分割太多列。僅在java中使用雙引號排除製表符/空格

在下面的例子中您可以看到「測試代碼」列後面有一個製表符代碼。當我在使用br.readline()這一行讀取時,想知道是否有辦法擺脫該選項卡,所以「測試代碼」變成「測試代碼」,我會想這樣做的每一行我讀過,基本上是用雙引號括起來的任何標籤。

「40198」, 「DD40198」 「4 - 正常」 「草案」 「」 「ABEND」, 「X10」, 「未分配」 「09月12日, 2016下午2時49分」 「」 「」 「」「測試代碼 「」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

你製作的很多人之前已經做了經驗;那就是:自己編寫的CSV解析器中斷只要遇到你沒有料到的輸入。

事情是:拉在一起正確 CSV分析器,它具有較強的抗各種有效 CVS輸入的是任務。

因此,我的建議是回到這裏考慮一些完全不同的東西:而不是按照意想不到的輸入來匹配您的CSV想法;嘗試使用一個現有的第三方庫進行CSV解析。

換句話說:這個輪子已經發明瞭很多次。只需要一個現有的,工作的,堅固的車輪,而不是再次重新發明它。也許這需要一些時間來獲得工作,但很有可能是而不是將繼續與您自己的解析器收益。

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

這工作完美,你的我的孩子藍色! –

0

對於您的問題沒有直接的方法來做到這一點。你需要一個自定義的方法來實現。在這裏,我正在給你解決這個問題。只要調用下面的方法並在將字符串拆分爲「\ 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(); 
} 

上述方法將移除分頁其是內部「」。所以你需要在上面調用方法來轉換你的字符串,然後再分割「\ t」

相關問題