cof*_*tor 45 java csv java.util.scanner
我的csv正在读入System.out,但我注意到任何带空格的文本都会被移动到下一行(作为返回\n)
这是我的csv开始的方式:
first,last,email,address 1, address 2
john,smith,blah@blah.com,123 St. Street,
Jane,Smith,blech@blech.com,4455 Roger Cir,apt 2
Run Code Online (Sandbox Code Playgroud)
运行我的应用程序后,任何带有空格(地址1)的单元格都会被抛到下一行.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class main {
public static void main(String[] args) {
// -define .csv file in app
String fileNameDefined = "uploadedcsv/employees.csv";
// -File class needed to turn stringName to actual file
File file = new File(fileNameDefined);
try{
// -read from filePooped with Scanner class
Scanner inputStream = new Scanner(file);
// hashNext() loops line-by-line
while(inputStream.hasNext()){
//read single line, put in string
String data = inputStream.next();
System.out.println(data + "***");
}
// after loop, close scanner
inputStream.close();
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
所以这是控制台中的结果:
first,last,email,address 1,address 2 john,smith,blah@blah.com,123 St. Street, Jane,Smith,blech@blech.com,4455 Roger Cir,apt 2
我使用Scanner不正确吗?
Sch*_*tod 146
请停止编写有故障的CSV解析器!
我已经在网上看到了数百个CSV解析器和所谓的教程.
几乎每一个人都错了!
这不会是一件坏事,因为它不会影响我,但是那些试图编写CSV 阅读器并弄错的人往往也会编写CSV 编写器.也让他们错了.而这些我必须编写解析器.
请记住CSV(按顺序增加不那么明显):
"foo","","bar"
或不:"foo",,"bar"
Frodo's Ring
将'Frodo''s Ring'
"foo""", """bar", """"
)如果您认为这显然不是问题,那么请再想一想.我已经看到这些项目中的每一项都被错误地实施了.甚至在主要的软件包中.(例如Office-Suites,CRM Systems)
有好的和正确工作的开箱即用的CSV读者和作者:
如果你坚持自己编写,至少要阅读(非常简短的)RFC for CSV.
Pan*_*kaj 42
scanner.useDelimiter(",");
Run Code Online (Sandbox Code Playgroud)
这应该工作.
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class TestScanner {
public static void main(String[] args) throws FileNotFoundException {
Scanner scanner = new Scanner(new File("/Users/pankaj/abc.csv"));
scanner.useDelimiter(",");
while(scanner.hasNext()){
System.out.print(scanner.next()+"|");
}
scanner.close();
}
}
Run Code Online (Sandbox Code Playgroud)
对于CSV文件:
a,b,c d,e
1,2,3 4,5
X,Y,Z A,B
Run Code Online (Sandbox Code Playgroud)
输出是:
a|b|c d|e
1|2|3 4|5
X|Y|Z A|B|
Run Code Online (Sandbox Code Playgroud)
Scanner.next()
不会读取换行符,而是读取由空格分隔的下一个标记(默认情况下,如果useDelimiter()
不用于更改分隔符模式).阅读一行使用Scanner.nextLine()
.
读完一行后,您可以使用String.split(",")
该行将字段分隔.这样可以识别不包含所需字段数的行.使用useDelimiter(",");
将忽略文件的基于行的结构(每行包含由逗号分隔的字段列表).例如:
while (inputStream.hasNextLine())
{
String line = inputStream.nextLine();
String[] fields = line.split(",");
if (fields.length >= 4) // At least one address specified.
{
for (String field: fields) System.out.print(field + "|");
System.out.println();
}
else
{
System.err.println("Invalid record: " + line);
}
}
Run Code Online (Sandbox Code Playgroud)
如前所述,建议使用CSV库.首先,这个(和useDelimiter(",")
解决方案)将无法正确处理包含,
字符的带引号的标识符.
归档时间: |
|
查看次数: |
187256 次 |
最近记录: |