3

タブ区切りのファイルがあり、ファイルからデータを読み取る必要があります。

Col1    Col2    Col3
data1   data2   data3
data1   data2   data3

すべての列に値が存在する場合、問題はありません。問題は、いくつかの列に以下のような値が含まれていない場合があることです。

Col1    Col2    Col3
data1           data3
data1   data2   

上記のデータでは、col2 の値が空の文字列になるため、最初の行のデータを読み取ることができます。しかし、2 行目の col3 にはデータがありません。ここで、配列インデックスが範囲外の例外を取得します。2 行目の col3 に空の文字列が表示されないのはなぜですか?

私は以下のコードを使用しています:

String dataFileName = "C:\\Documents and Settings\\User1\\some.txt";

         /**
          * Creating a buffered reader to read the file
          */
         BufferedReader bReader = new BufferedReader(
                 new FileReader(dataFileName));

         String line;

         /**
          * Looping the read block until all lines in the file are read.
          */
         while ((line = bReader.readLine()) != null) {

             /**
              * Splitting the content of tabbed separated line
              */
             String datavalue[] = line.split("\t");
             String value1 = datavalue[0];
             String value2 = datavalue[1];
             String value3 = datavalue[2];
}

ありがとう!

4

2 に答える 2

3

怠惰な方法は次のようになります。

...
String datavalue[] = Arrays.copyOf(line.split("\t"),3);
String value1 = datavalue[0];
String value2 = datavalue[1];
String value3 = datavalue[2];
...

基本的に、コンテンツを分割し、パディングされた要素が文書化されているように null である新しい配列にコピーしています。

コピーが指定された長さになるように、指定された配列をコピーし、(必要に応じて) 切り捨てるか null でパディングします。元の配列とコピーの両方で有効なすべてのインデックスについて、2 つの配列には同じ値が含まれます。コピーでは有効であるがオリジナルでは無効なインデックスの場合、コピーには null が含まれます。このようなインデックスは、指定された長さが元の配列の長さよりも大きい場合にのみ存在します。結果の配列は、元の配列とまったく同じクラスです。

于 2013-04-18T09:49:54.783 に答える
2

デフォルトでは、String.splitは重複するセパレーターを 1 つにマージします。負の 2 番目のパラメーターを使用する必要があります。

String datavalue[] = (line+"\t\t\t").split("\t",-1);

また、元のファイルに末尾のタブがない場合は、行に余分なタブを追加して、コードの破損を防ぐことができます。

于 2013-04-18T09:52:56.347 に答える