如何读取 java 中一半或三分之一的文件?

How to read half or one-third file in java?

我有超过 300 个 CSV 文件,我应该读取所​​有这些文件,然后对它们执行各种操作。首先,我应该读取唯一的一半文件,然后,我应该读取三分之一的文件。

这是 CSV 文件的样子。我应该只阅读 avg_rss12 专栏,而且也只先阅读半栏,然后再阅读三分之一。每个文件中有超过 500 行,每个文件中的行数随每个文件而变化。

假设一个文件有 500 行,那么我应该首先读取 250 行(对于半个文件)和 167 行,如果我应该读取三分之一的文件。每个文件的行数不一样,有300多行,我没法手动修改每个文件。

# Task: bending1                        
# Frequency (Hz): 20                        
# Clock (millisecond): 250                      
# Duration (seconds): 120                       
# Columns: time avg_rss12   var_rss12   avg_rss13   var_rss13   avg_rss23   var_rss23
0   39.25   0.43    22.75   0.43    33.75   1.3
250 39.25   0.43    23  0   33  0
500 39.25   0.43    23.25   0.43    33  0
750 39.5    0.5 23  0.71    33  0
1000    39.5    0.5 24  0   33  0
1250    39.25   0.43    24  0   33  0
1500    39.25   0.43    24  0   33  0

这是我的代码。由于某种原因,它根本没有读取文件。我的方法是正确的还是我做错了什么?

public static void main(String args[])
        {
            String path_Test = "E:\DTW-KNN\Dataset\Test\bending1\dataset1.csv";

            File dataFile = new File(path_Test);
            long data_size = dataFile.length();
            String[] test = null;
            int count = 0;
            int i;

            try {
                BufferedReader reader = new BufferedReader(new FileReader(dataFile));
                for (i = 0; i <= data_size/2.0; i++) {

                test[i] = reader.readLine();
                    System.out.println(test[i]);
                    count++;
                }

            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            System.out.println(count);

        }

您似乎试图将行存储在 null 数组 (test) 中。在尝试将任何数据放入其中之前,您必须将数组分配给(至少)文件中行数的一半。

我会做这样的事情。只需将所有有效行读入列表,然后您可以遍历您想要的数量并从中解析您想要的任何数据。

    Scanner scan = new Scanner(new File("dataset1.csv"));
    List<String> lines = new ArrayList<>();
    while (scan.hasNextLine()) {
        String line = scan.nextLine();
        // If line is not a comment or empty
        if (!line.startsWith("#") && !line.trim().isEmpty()) {
            lines.add(line);
        }
    }
    scan.close();
    // Go through half the lines
    for (int i = 0; i < lines.size() / 2; ++i) {
        String line = lines.get(i);
        String[] split = line.split("\s+");  // split on whitespace
        double avg_rss12 = Double.parseDouble(split[1]);
        System.out.println(avg_rss12);
    }

您的代码无法正常工作,但稍作修改即可读取整个文件并显示在控制台上(最少修改为看起来像您的代码):

public static void main(String args[]) {
    String pathTest = "E:\DTW-KNN\Dataset\Test\bending1\dataset1.csv";
    File file = new File(pathTest);
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(file));

        String line = reader.readLine();
        while (line != null) {
            System.out.println(line);
            line = reader.readLine();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (reader != null) {
            try {
                reader.close(); //always close it, or use try-with-resources from Java7 :)
            } catch (IOException e) {
            }
        }
    }
}

不清楚您是否需要读取 300 个文件的一半和 one-third 或每个文件,但我相信是第二种选择,所以我的策略是:

  • 获取文件中的行数(注意 file.length() returns 文件中的字节数)
  • 根据行数计算需要阅读的行数(二分之一或三分之一)
  • 阅读必要的行数

在 Java 8 中,您可以使用以下方法从文件中获取行数:

Files.lines(Paths.get(fileName)).count();