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

时间:2018-04-03 20:23:15

标签: java bufferedreader

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

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

        }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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个文件中的一半和三分之一或每个文件,但我认为这是第二个选项,因此我的策略是:

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

在Java 8中,您可以使用以下命令从文件中获取行数

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