0

我有一个 300 行左右的文本文件。格式如下:

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

    // more data

我需要逐行读取文本文件,因为每一行数据都应该放在一起以进行进一步处理。

现在我只对每一行使用字符串数组并按索引访问数据。

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);

    ....

然而,我意识到如果文本文件改变它的格式(例如切换两列,或插入另一列),它会破坏我的程序(通过索引访问可能是错误的,甚至导致异常)。

所以我想使用标题作为参考来访问每一列。也许 HashMap 是一个不错的选择,但是由于我必须将每一行数据放在一起,如果我为每一行构建一个 HashMap,那将太昂贵了。

有人对此有任何想法吗?请帮忙!

4

6 回答 6

1

您可以使用opencsv读取文件。

CSVReader reader = new CSVReader(new FileReader("yourfile.txt"), '\t');
List<String[]> lines = reader.readAll();

第一行包含标题。

于 2013-08-16T18:35:09.403 回答
1

您只需要一个哈希映射即可将列名映射到正确的列索引。您可以像以前一样使用整数索引来填充数组,以按名称检索您要使用的列array[hashmap.get("Amount")]

于 2013-08-16T23:54:01.197 回答
0

you can read each line of the file and assuming that the first line of the file has the column header you can parse that line to get all the names of the columns.

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

This will give you the name of all the columns now you just read through splitting on tabs and they will all line up.

于 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]);

        }
    }

它会给你灵活性,并且只需要制作一次地图。然后,您可以从映射中获取数据列表,因此它应该是您程序的其余部分使用的方便的数据结构。

于 2013-08-16T19:06:37.037 回答
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

使用标准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 回答