

プログラミング初心者です。初歩的な質問をしてしまい誠に申し訳ございません。  
CSVファイルのデータを扱いやすくするために、二次元配列への変換を検討しております。

CSVファイルの構造は以下のとおりです。

[code]

    abase
    abash
    abate
    abbey　・・・・
    
[/code]

現在、[JavaでCSVファイルの読み込みを行う](https://uxmilk.jp/48018)
のページを参考に下記コードを書いたところ、アウトプットが以下のように表示されます。

[code]

    import java.io.File;
    import java.io.FileReader;
    import java.io.BufferedReader;
    import java.io.IOException;
    
    class Sample {
      public static void main(String args[]) {
        try {
          File f = new File("sample.csv");
          BufferedReader br = new BufferedReader(new FileReader(f));
    
          String[][] data = new String[2][2];
          String line = br.readLine();
          for (int row = 0; line != null; row++) {
            data[row] = line.split(",", 0);
            line = br.readLine();
          }
          br.close();
    
          // CSVから読み込んだ配列の中身を表示
          for(int row = 0; row < data.length; row++) {
            for(int col = 0; col < data.length; col++) {
              System.out.println(data[row][col]);
            }
          } 
    
        } catch (IOException e) {
          System.out.println(e);
        }
      }
    }
    
[/code]

[code]

    nul
    nul
    nul
    nul
    
[/code]

列が一列しかない場合は二次元配列への変換がそもそもできないという認識でよろしいでしょうか。また、何か他の代替案等ございましたらご教示いただけますと幸いです。

どうぞよろしくお願いいたします。


CC BY-SA 4.0
2019-03-03T06:00:05.247
53156
2019-03-03T19:12:26.333
2019-03-03T07:21:56.950
26303
26303
question
java
1列×数千行のCSVファイルを二次元配列に変換するには

[code]

            data[row] = line.split(",", 0);
    
[/code]

のところに問題があるのだと思います。

splitメソッドは文字列を区切り文字(上記のコードではカンマ)で区切って複数の文字列に分割するものです。  
そして、splitメソッドの第２引数は、返す分割後文字列の数を指定するものです。  
それが、0なので、一つも文字列を返さないという意味になって、nul (空文字列)が返されているのでしょう。

[code]

                data[row] = line.split(",");
    
[/code]

に変更してみてください。

＝＝  
補足（おせっかい）  
＝＝  
CSVは、"comma-separated values" （カンマで区切った[複数の]値)、もしくは"comma-separated vector"
（カンマで区切った値の列）の略語で、普通はCSVファイルの各行にはカンマが含まれています。

しかし、質問のデータは各行にカンマを含まない文字列があるだけです。  
だから、その文字列（"abase"など)をカンマで区切るのは無意味です。

１行読みだしたら、それを配列の要素に代入する、というのを繰り返すだけでCSVファイルの内容を、配列dataに入れることができますよ。


CC BY-SA 4.0
2019-03-03T07:57:02.683
53161
2019-03-03T07:57:02.683
217
53156
answer


「数千行」のファイルならば、`String[][] data = new String[2][2];` の変数宣言はダメでしょう。  
さらに、おそらく行数は固定では無いでしょうから、ArrayListに格納する方が良いのでは？

以下のような手順で処理すれば良いと思われます。  
元のテキストデータの、連続する奇数行目と偶数行目でペアとして扱うことを想定しています。

  1. 可変行数のテキストファイルの読み込みは、例えばこの記事の内容をサブルーチンとして呼び出す。  
[テキストファイルからArrayListを作る(30分)](http://www.coderesume.com/modules/answer/?quiz=j02500)

[code]     ArrayList<String> textLines = new ArrayList<String>();

    boolean result = false;
    result = readTextFileLines("sample.csv", textLines);
    
[/code]

  2. 上記結果が奇数行だった場合に、ArrayListに無効なデータを示す空文字列か何かを1つ追加しておく。
[code]     if (textLines.size() % 2 == 1) {

        textLines.add("");
    }
    
[/code]

  3. ArrayListのsize()を使って2次元配列を宣言する。
[code]     int rowcount = textLines.size() / 2;

    String[][] data = new String[rowcount][2];
    
[/code]

  4. 2次元配列にArrayListからデータをコピーしていく。
[code]     for(int row = 0; row < rowcount; row++) {

        data[row][0] = textLines.get(row * 2);
        data[row][1] = textLines.get(row * 2 + 1);
    }
    
[/code]

  5. 作成した2次元配列データを表示するなり、ハミング距離を調べるなり、何らかの処理を行う。

元のテキストデータを、どのように2次元配列に配置するか、の想定が変われば、2. 3. 4. の処理がそれに合わせて変わることになります。

* * *
[code]

    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    
    class Sample {
    
        public static void main(String args[]) {
            try {
                ArrayList<String> textLines = new ArrayList<String>();
                boolean result = false;
                result = readTextFileLines("sample.csv", textLines);
                if (result == false) {
                    return;
                }
                if (textLines.size() % 2 == 1) {
                    textLines.add("");
                }
                int rowcount = textLines.size() / 2;
                String[][] data = new String[rowcount][2];
                for(int row = 0; row < rowcount; row++) {
                    data[row][0] = textLines.get(row * 2);
                    data[row][1] = textLines.get(row * 2 + 1);
                }
                for(int row = 0; row < data.length; row++) {
                    for(int col = 0; col < data.length; col++) {
                        System.out.println(data[row][col]);
                    }
                }
            } catch (Exception e) {
              System.out.println(e);
            }
        }
    
        public static boolean readTextFileLines( String filePath, ArrayList<String> textLines )
        {
            boolean result = false;
            FileReader fr = null;
            BufferedReader br = null;
            try
            {
                fr = new FileReader( filePath );
                br = new BufferedReader( fr );
                String line = br.readLine();
                while( line != null )
                {
                    textLines.add( line );
                    line = br.readLine();
                }
                result = true;
            }
            catch( FileNotFoundException e )
            {
                System.out.println( e );
            }
            catch( IOException e )
            {
                System.out.println( e );
            }
            finally
            {
                try
                {
                    if( br != null ) {
                        br.close();
                    }
                    else if( fr != null ) {
                        fr.close();
                    }
                }
                catch( IOException e )
                {
                    System.out.println(e);
                }
            }
            return result;
        }
    }
    
[/code]


CC BY-SA 4.0
2019-03-03T09:29:25.197
53165
2019-03-03T19:12:26.333
2019-03-03T19:12:26.333
26370
26370
53156
answer