我有一个奇怪的问题:我有一个CSV文件,我用记事本和MS Excel 2010正确读取。
我尝试使用以下代码读取此文件的行:
BufferedReader source = new BufferedReader(new FileReader(fileName));
String currentRow = null;
while (null != (currentRow=source.readLine())){
System.outprintln(currentRow)
}
当程序运行时,我只读取二进制字符,行的长度与实际不同(我希望行的2000个字符,我找到55个字符或1个字符)。
我在Eclipse工作:如果我打开这个CSV文件作为文本编辑器我读了奇怪的字符,当我打开它作为系统编辑器我在MS中读取了正确的值Excel中。
此文件的类型是文件,其逗号分隔值为Microsoft Excel :此文件是否包含一些二进制字符?
我尝试使用以下代码使用Apache POI(使用CSV和XLS读取文件):
public void displayFromExcel (String xlsPath){
POIFSFileSystem fileSystem = null;
try{
fileSystem = new POIFSFileSystem (new FileInputStream (xlsPath));
HSSFWorkbook workBook = new HSSFWorkbook (fileSystem);
HSSFSheet sheet = workBook.getSheetAt (0);
Iterator<Row> rows = sheet.rowIterator();
while (rows.hasNext ()){
HSSFRow row = (HSSFRow) rows.next ();
System.out.println ("Row No.: " + row.getRowNum ());
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext ()){
HSSFCell cell = (HSSFCell) cells.next ();
System.out.println ("Cell No.: " + cell.getCellNum ());
switch (cell.getCellType ()){
case HSSFCell.CELL_TYPE_NUMERIC :
System.out.println ("Numeric value: " + cell.getNumericCellValue ());
break;
case HSSFCell.CELL_TYPE_STRING :
HSSFRichTextString richTextString = cell.getRichStringCellValue ();
System.out.println ("String value: " + richTextString.getString ());
break;
default :
System.out.println ("Type not supported.");
break;
}
}
}
} catch (IOException e) {
e.printStackTrace ();
}
}
它无效,我收到此消息到控制台:
java.io.IOException: Invalid header signature; read 0x003000310030FEFF, expected 0xE11AB1A1E011CFD0
at org.apache.poi.poifs.storage.HeaderBlockReader.<init>(HeaderBlockReader.java:125)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:153)
当它运行此指令时:
POIFSFileSystem fileSystem = new POIFSFileSystem (new FileInputStream (xlsPath));
我尝试使用库datafile和Java I / O(DataInputstream
等),但没有成功。
对解决方案有任何想法吗?
答案 0 :(得分:1)
您需要使用比FileReader更复杂的内容来阅读此文件。查看How to reliably guess encoding。然后要么找到能够将文件读取为编码的东西,要么写出能够过滤掉垃圾的东西。我发现如果你把文件视为直接的ASCII并丢弃所有不是有效的ASCII字符的文件,它会非常好地读取一个直接的Unicode文件(以及一个直接的ASCII文件)。如果它是带有埃及象形文字的UTF-8(你想要那些象形文字),这种方法效果不是很好。
所以首先尝试让“他们”给你一个更好的文件。如果这不起作用,请在java.io Javadoc中进行一些研究,然后进行一些编程。