如何在java中读取一半或三分之一的文件?
我有300多个CSV文件,我应该读取所有这些文件,然后对它们执行各种操作。首先,我应该读取仅有的半个文件,然后,稍后,我应该读取三分之一的文件 这就是CSV文件的外观。我应该只读avg_rss12列,而且也只读半列,然后再读三分之一。每个文件中有500多行,每个文件中的行数会因每个文件而更改 假设一个文件有500行,那么我应该读取前250行(对于半个文件),如果我应该读取三分之一的文件,则应该读取167行。每个文件中的行数不同,有300多行,因此我无法手动修改每个文件如何在java中读取一半或三分之一的文件?,java,bufferedreader,Java,Bufferedreader,我有300多个CSV文件,我应该读取所有这些文件,然后对它们执行各种操作。首先,我应该读取仅有的半个文件,然后,稍后,我应该读取三分之一的文件 这就是CSV文件的外观。我应该只读avg_rss12列,而且也只读半列,然后再读三分之一。每个文件中有500多行,每个文件中的行数会因每个文件而更改 假设一个文件有500行,那么我应该读取前250行(对于半个文件),如果我应该读取三分之一的文件,则应该读取167行。每个文件中的行数不同,有300多行,因此我无法手动修改每个文件 # Task: bendi
# 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);
}
publicstaticvoidmain(字符串参数[])
{
字符串路径\u Test=“E:\\DTW-KNN\\Dataset\\Test\\bending1\\dataset1.csv”;
文件数据文件=新文件(路径测试);
长数据_size=dataFile.length();
字符串[]test=null;
整数计数=0;
int i;
试一试{
BufferedReader reader=新BufferedReader(新文件读取器(数据文件));
对于(i=0;i您似乎试图将行存储在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);
}
Scanner scan=新扫描仪(新文件(“dataset1.csv”);
列表行=新的ArrayList();
while(scan.hasNextLine()){
String line=scan.nextLine();
//如果行不是注释或空
如果(!line.startsWith(“#”)&&!line.trim().isEmpty()){
行。添加(行);
}
}
scan.close();
//过半
对于(int i=0;i
您的代码不起作用,但只需稍作修改,您就可以读取整个文件并显示在控制台上(修改的最小值与您的代码相似):
不清楚您是否需要阅读300个文件中的一半和三分之一或每个文件,但我认为这是第二种选择,因此我的策略是:
- 获取文件中的行数(注意file.length()返回文件中的字节数)
- 根据行数(半行或三分之一)计算需要读取的行数
- 阅读必要的行数
在Java 8中,可以使用以下命令从文件中获取行数:
Files.lines(Paths.get(fileName)).count();
File.length();
将以字节为单位显示文件大小。这并不一定意味着读取一半字节将读取一半行。相反,您应该在计算行数时读取文件中的所有数据,并在最后读取(一旦您知道有多少行)只需扔掉不需要的行。如果数据大小为n字节,则尝试读取n/2行。如果文件有一行300字节,则尝试读取150行….“根本不读取文件”的确切含义是什么?将for
循环检查作为浮点操作进行,不会给您带来任何好处,也会降低性能。@Tripkinetics类似这样的长行数=Files.lines(path.count();在java 8中?@Samvid Kulkarni非常正确。除非您事先知道文件中有多少行,否则您必须全部读取。文件不“知道”里面有多少行。
Files.lines(Paths.get(fileName)).count();