0

300 行程度のテキスト ファイルがあります。フォーマットは次のようになります。

    Name      Amount     Unit    CountOfOrder
      A         1         ml          5000
      B         1         mgm         4500
      C         4         gm          4200

    // more data

データの各行をまとめてさらに処理する必要があるため、テキスト ファイルを 1 行ずつ読み取る必要があります。

これで、各行に文字列配列を使用し、インデックスでデータにアクセスするだけです。

for each line in file:
    array[0] = {data from the 'Name' column}
    array[1] = {data from the 'Amount' column}
    array[2] = {data from the 'Unit' column}
    array[3] = {data from the 'CountOfOrder' column}
    ....

    someOtherMethods(array);

    ....

しかし、テキスト ファイルの形式が変わると (たとえば、2 つの列を入れ替えたり、別の列を挿入したり)、プログラムが壊れてしまうことに気付きました (インデックスを介したアクセスが間違っているか、例外が発生することさえあります)。

そこで、タイトルを参考にして各コラムにアクセスしたいと思います。HashMap は良いオプションかもしれませんが、データの各行をまとめて保持する必要があるため、行ごとに HashMap を作成するとコストがかかりすぎます。

誰もこれについて考えていますか?助けてください!

4

6 に答える 6

1

列名を適切な列インデックスにマップするために必要なハッシュ マップは 1 つだけです。以前と同じように整数でインデックスを付けて配列を埋め、使用する名前で列を取得しますarray[hashmap.get("Amount")]

于 2013-08-16T23:54:01.197 に答える
0

これにより、列の個別のリストが表示されます

       public static void main(String args[]) throws FileNotFoundException, IOException {
            List<String> headerList = new ArrayList<String>();
            List<String> column1 = new ArrayList<String>();
            List<String> column2 = new ArrayList<String>();
            List<String> column3 = new ArrayList<String>();
            List<String> column4 = new ArrayList<String>();

            int lineCount=0;

            BufferedReader br = new BufferedReader(new FileReader("file.txt"));
                try {
                    StringBuilder sb = new StringBuilder();
                    String line = br.readLine();
                    String tokens[];

                    while (line != null) {
                        tokens = line.split("\t");
                        if(lineCount != 0)
                        {
                           int count = 0;
                           column1.add(tokens[count]); ++count;
                           column2.add(tokens[count]); ++count;
                           column3.add(tokens[count]); ++count;
                           column4.add(tokens[count]); ++count;
                           continue;
                         }

                        if(lineCount==0){
                            for(int count=0; count<tokens.length; count++){
                                    headerList.add(tokens[count]);
                                    lineCount++;
                            }
                        }

                    }
                } catch (IOException e) {
                    } finally {
                             br.close();
                         }


        } 
于 2013-08-16T19:14:21.683 に答える
0

ファイルの各行を読み取ることができ、ファイルの最初の行に列ヘッダーがあると仮定すると、その行を解析して列のすべての名前を取得できます。

String[] column_headers = firstline.split("\t");

これにより、タブを分割して読んだばかりのすべての列の名前が得られ、それらはすべて整列します。

于 2013-08-16T18:49:58.090 に答える
0

次のようなことができます。

    BufferedReader in = new BufferedReader(new InputStreamReader(
            new FileInputStream(FILE)));

    String line = null;
    String[] headers = null;
    String[] data = null;
    Map<String, List<String>> contents = new HashMap<String, List<String>>();

    if ((line = in.readLine()) != null) {
        headers = line.split("\t");
    }
    for(String h : headers){
        contents.put(h, new ArrayList<String>());
    }
    while ((line = in.readLine()) != null) {
        data = line.split("\t");
        if(data.length != headers.length){
            throw new Exception();
        }
        for(int i = 0; i < data.length; i++){
            contents.get(headers[i]).add(data[i]);

        }
    }

柔軟性があり、マップを作成する必要があるのは 1 回だけです。次に、マップからデータ リストを取得できるので、プログラムの残りの部分で使用するのに便利なデータ構造にする必要があります。

于 2013-08-16T19:06:37.037 に答える
0

標準を使用してjava.util.Scanner

    String aa = "   asd    9    1   3  \n d -1 4 2";
    Scanner ss = new Scanner(aa);
    ss.useDelimiter("\n");
    while ( ss.hasNext()){
        String line = ss.next();
        Scanner fs = new Scanner(line);
     System.out.println(  "1>"+     fs.next()+" " +fs.nextInt() +" " +fs.nextLong()+" " +fs.nextBigDecimal());

    }

たくさんのハッシュマップを使用しても大丈夫です...私は恐れません;)大量のデータを処理する必要がある場合...それからあなたの問題をデータ処理変換に変換してみてください

例:すべてのデータをハッシュマップに読み込みますが、何らかのJPA実装を使用してデータベースに保存します....その後、データを一巡できます;)\

于 2013-08-16T19:52:13.070 に答える