2016-09-13 6 views
1

タブで区切られたCSVファイルを読み取るプログラムがあります。誰かがカラムの1つの中にタブを追加するまで働いていた私のプログラムで\ t分けています。ストリップタブ/空白はJavaの中でのみダブルクォートの中にある

以下の例では、「テストコード」の列には、単語コードの後に​​タブが付きます。 br.readline()を使ってこの行を読むと、そのタブを取り除く方法があるかどうか疑問に思っていたので"テストコード"になります。 "テストコード"、私はこれをすべての行私は基本的に二重引用符で囲まれた刺し傷からタブを取り除くことを読んだ。

"40198" "DD40198" "4 - ノーマル" "DRAFT" "" "ABEND" "X10" "未使用" "9月12日、 2016 14: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パーサーが壊れてになります。

事は次のとおりです。一緒に有効 CVS入力のすべての種類に強い正しい CSVパーサを引っ張っハード作業です。

私はここに戻って、まったく違うものを考えてみましょう。予想外の入力をマッサージして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"で分割する前に文字列を変換するには、上記のメソッドを呼び出す必要があります。

関連する問題