如何读取 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();
我有超过 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();