我正在创建一个程序,该程序读取大块数据,我需要将它们分开,我想知道java中是否有一个函数,当Java开始以新行开始读取时,该函数会通知我,我使用扫描仪读取文本文件的方式,如果发生任何更改,这些文件也是CSV文件。
我尝试过在线寻找解决此问题的方法,还阅读了扫描仪可以执行的功能以及找不到有用的东西
公共类ScannerReading {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("C:\\myfile.txt");
Scanner scanner = new Scanner(file);
scanner.useDelimiter(",");
String data = scanner.nextLine();
data = scanner.nextLine();
while(scanner.hasNext()){
if(data.contains(" ")) {
System.out.println("I have a line lol");
}
System.out.print(data+" ");
}
scanner.close();
}
}
我希望输出第1行:从第一行中提取的信息
答案 0 :(得分:2)
您的问题的直接答案是,使用Scanner::next
/ Scanner::hasNext
时无法找出是否刚刚开始新行。更一般而言,没有办法找出最后一个分隔符是什么。分隔符将被丢弃。
正如JB Nizet所说的那样,有许多现有的开源CSV阅读器库,因此不需要使用Scanner
来实现此功能。实际上,正确实现CSV读取 并非易事,尤其是在需要实现标头,引号,转义和/或续行的情况下。建议使用现有的库。
但是,如果(反对建议!)您决定直接实现阅读器,那么更健壮的方法是使用嵌套循环:
nextLine
读取整行Scanner
,以将其拆分为字段。除了不处理引号,转义,续行等。真正的问题是CSV语法没有简单的上下文无关定界符。
我想我也许可以使用某种计数器来计数[字段]
是的...但是,如果CSV中的某些行缺少字段(例如,由于人为错误),则对字段进行计数将无法检测到这一点。