web-dev-qa-db-ja.com

CSVファイルを配列に読み込む

Csvファイル「read_ex.csv」を配列に読み取ろうとしています。 web/stackoverflowで無限に検索して、ファイルを配列に読み込む方法を見つけました。私ができることはストリーミング形式で読むことですが、ファイルのサイズが可変であるため、配列に保存することはできません。 ArrayListは可変サイズの配列を処理するメソッドであると信じていますが、その操作方法はわかりません。基本的に、whileループが終了した後、文字列配列の「値」にアクセスできるようにしたいと考えています。

import Java.util.Scanner;
import Java.io.FileNotFoundException;
import Java.io.File;

public class sortarray {
     public static void main (String []agrs){
         String fileName= "read_ex.csv";
         File file= new File(fileName);


         try{
             Scanner inputStream= new Scanner(file);
             while(inputStream.hasNext()){
             String data= inputStream.next();
             String[] values = data.split(",");
             System.out.println(values[1]);
             }
             inputStream.close();
          }catch (FileNotFoundException e) {
             e.printStackTrace();
     }
     //This prints out the working directory
     System.out.println("Present Project Directory : "+ System.getProperty("user.dir"));

    }           

}
8
mikeL

@ Minjun.Yで言及されているようにApache CSVライブラリを使用することはまったく問題ありませんが、私はあなたのコードにより近く、たぶんあなたがたどりやすいソリューションを提供しようとしています:

_import Java.io.File;
import Java.io.FileNotFoundException;
import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.List;
import Java.util.Scanner;

public class CsvParser {

    public static void main(String[] args) {
        String fileName= "read_ex.csv";
        File file= new File(fileName);

        // this gives you a 2-dimensional array of strings
        List<List<String>> lines = new ArrayList<>();
        Scanner inputStream;

        try{
            inputStream = new Scanner(file);

            while(inputStream.hasNext()){
                String line= inputStream.next();
                String[] values = line.split(",");
                // this adds the currently parsed line to the 2-dimensional string array
                lines.add(Arrays.asList(values));
            }

            inputStream.close();
        }catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        // the following code lets you iterate through the 2-dimensional array
        int lineNo = 1;
        for(List<String> line: lines) {
            int columnNo = 1;
            for (String value: line) {
                System.out.println("Line " + lineNo + " Column " + columnNo + ": " + value);
                columnNo++;
            }
            lineNo++;
        }
    }

}
_

手順を追って説明しましょう。

  1. さらに3つのインポートを追加しました:ArrayListArraysおよびList-すぐに表示されます。これらはすべて、すべてのJDKで利用可能な標準ライブラリである_Java.util_ライブラリから取得されます。

  2. Javaのすべてのクラス名は大文字で始まります(慣例により-小文字でも構築されますが、この慣習に慣れる必要があります)-私はこれを「修正」しましたコード。

  3. 2次元配列List<List<String>> lines = new ArrayList<>()を追加しました。これは最初は少しわかりにくいかもしれませんが、意味は、解析の結果を保持する変数linesを作成することです。 _List<String>_構文は、タイプパラメータListを持つ generic typeString-つまり、文字列のリストがあることを意味します。 _List<List<String>>_全体は、文字列のリストのリスト、つまり2次元の文字列配列があることを意味します。

  4. whileループのlines.add(Arrays.asList(values))を使用して、解析した行をこの2次元配列に追加できます。 Arrays.asList(values)は、_String[]_型と互換性が必要なため、_List<List<...>>_配列をListに変換します。これにより、行の長さが可変になります。

  5. 最後に追加した行は、2次元配列の内容を出力するだけであり、この配列の値にアクセスする方法の良い例を示しています。この構成についてさらにヘルプが必要な場合は、 foreachループのドキュメント を確認してください。

これを入力ファイル(_read_ex.csv_)として指定すると:

_value_1-1,value_1-2,value_1-3,value_1-4
value_2-1,value_2-2,value_2-3,value_2-4
value_3-1,value_3-2,value_3-3,value_3-4
value_4-1,value_4-2,value_4-3,value_4-4
value_5-1,value_5-2,value_5-3,value_5-4
_

プログラムは次の出力を印刷します。

_Line 1 Column 1: value_1-1
Line 1 Column 2: value_1-2
Line 1 Column 3: value_1-3
Line 1 Column 4: value_1-4
Line 2 Column 1: value_2-1
Line 2 Column 2: value_2-2
Line 2 Column 3: value_2-3
Line 2 Column 4: value_2-4
Line 3 Column 1: value_3-1
Line 3 Column 2: value_3-2
Line 3 Column 3: value_3-3
Line 3 Column 4: value_3-4
Line 4 Column 1: value_4-1
Line 4 Column 2: value_4-2
Line 4 Column 3: value_4-3
Line 4 Column 4: value_4-4
Line 5 Column 1: value_5-1
Line 5 Column 2: value_5-2
Line 5 Column 3: value_5-3
Line 5 Column 4: value_5-4
_

お役に立てれば :)

17
Michael Lihs

私はJavaが初めてで、初心者が理解できるcsvをファイルに読み込む任意のメソッドに対してオープンになります。

Apache CommonsApache Commons CSV プロジェクトの既存のソリューションを次に示します。 Apache Commons CSVパーサーガイド を参照してください。

箱から出してすぐに使用できます。

基本的なworfklowは次のとおりです。

  • csv ファイルの列に「一致する」フィールドを持つクラスを作成します。
  • Csvの各行は、csvのフィールドに対応するプロパティを持つそのクラスのオブジェクトです。ライブラリを使用して各フィールドを取得し、ループ内のオブジェクトに保存します。
  • ループでは、ArrayListのcsvから読み取ったフィールド/プロパティと共にオブジェクトを保存します
  • ループの終了後、ArrayListにはcsvファイルの行に「一致する」要素が含まれます。リスト内の任意の行/要素に自由にアクセスできます。

List および ArrayList がJavaでどのように機能するかよくわからない場合は、ほとんどのJava Oracle Tutorial を含むオンラインチュートリアル。

Stackoverflowを検索 Commons CSVの使用に関する数百の投稿。

8
Minjun Yu