2016-12-16 14 views
-3

いくつかの行には"\N"のフラットカンマ区切りファイルがあります。私はすべての行を読み込み、それらを含まないすべての行をスキップする必要があります\N。 私は以下を実行しようとしていますが、動作しません。上記のコードJavaのエスケープ文字を確認してください

if (!line.contains("\\N")) { 
    //do load here 
} 

はまだ下のcsvファイルからの行を渡します。

1,text,abc,\N,23,56 

し、我々は(それがそこのInt値でなければなりません)はNumberFormatExceptionを持っています。 なぜこれが起こっていますか?

+1

*すべての行を読み込んで、すべての行をスキップする必要があります。\ Nが含まれていません。 – shmosel

+1

[mcve] – GhostCat

+1

私たちが問題を解決するために行ったコードを追加してください。 – Joe

答えて

0

\ Nを含むファイル行だけを処理する場合は、を省略してください!(感嘆符)の文字はの場合ステートメントの状態です。これはNOTフラグです。

何あなたの条件は基本的には今言っていることです:は\ Nが含まれていません

文字列内に含まれる現在のテキストファイルの行の場合は、変数 ラインは、内のコードを実行しますの場合ステートメントブロック。供給条件がブールの場合

IF文にのみ実行されます。 !を適用!フラグは、基本的に条件がの場合、であり、条件がでない場合は、となります。 Thisがあなたにもっと役立つかもしれません。

あなたは\ Nが含まれている場合と同じこれらの行をしたい場合は、あなたのコードは次のようになります。あなたはN \ を含むこれらのファイルの行を処理する必要はありませください場合

if (line.contains("\\N")) { 
    //process line here 
} 

がうまく動作するはずです。あなたの質問について

をし、我々は(それがそこのInt値でなければなりません)はNumberFormatExceptionを持っています。 なぜこれが起こっていますか?

\ nは(小文字n)は、一般的に処理されたときに、大文字のNが、それはこれをしないで使用されている場合、新しい行を強制するために、文字列内で適用されたタグです。一般に、多くのCSVファイルは\ Nを使用してNULLを意味し、他のものは単に区切り文字だけを配置します。なぜのような実際の理由を見つけるためにCSVファイルを作成しているのか調べる必要があります。NULLと考えることができます。

if (line.contains("\\N") { line = line.replace("\\N", "0"); } 

ます。ただし、文字列の上の行がするので、そこにあるべき\ Nが発生する可能性があり:整数変数がNullことはありませんあなたがあなたのコードを変更することができるように、彼らは、デフォルトでは0を含むと考えられるであろうあなたは良くないですか?一つの解決策は、ファイルの行を分割した後、たとえば、(それはあるはず)配列の各要素の内容の中に\ Nを処理するために、次のようになります。

String csvFilePath = "MyCSVfile.txt"; // assuming file is in classpath 
try (BufferedReader br = new BufferedReader(new FileReader("MyCSVfile.txt"))) { 
    int j = 0; //used as a counter 
    String line = ""; 
    while ((line = br.readLine()) != null) { 
     j++; //increment counter 
     String[] data = line.split(","); 
     //if the ID value contains null then apply the counter (j) value. 
     int id = Integer.parseInt(data[0].replace("\\N",String.valueOf(j))); 
     String type = data[1].replace("\\N",""); 
     String text = data[2].replace("\\N",""); 
     int value1 = Integer.parseInt(data[3].replace("\\N","0")); 
     int value2 = Integer.parseInt(data[4].replace("\\N","0")); 
     int value3 = Integer.parseInt(data[5].replace("\\N","0")); 
     System.out.println("ID is:\t\t" + id + "\nData Type is:\t" + type + 
          "\nText is:\t" + text + "\nValue 1 is:\t" + value1 + 
          "\nValue 2 is:\t" + value2 + "\nValue 3 is:\t" + 
          value3 + "\n"); 
    } 
    br.close(); 
} 
catch (IOException ex) { 
    //however you want to handle exception 
} 

これは\ Nタグを処理しますどのCSVファイルラインでもどこで遭遇するかにかかわらず。

+1

例外のメッセージを出力することは決してお勧めできません。メッセージは例外クラスのコンテキストなしでは意味を成さないことが多く、多くの例外にはメッセージがまったくありません。常に 'ex.printStackTrace();'を実行するか、例外をスタックトレースを記録するロガーメソッドに送ります。 – VGR

+0

@VGR - 良い点...私は、IOExceptionが妥当なメッセージを "与えなかった"という例外を起こさなかったことに気付かなかった。 – DevilsHnd

関連する問題