我有以下代码,我正在尝试从文件" file.txt"中提取所有数据。目前这个文件只有一行:
from sqlalchemy import MetaData, Integer, Float, String
from sqlalchemy import Table, Column
metadata = MetaData()
income = Table(
'income', metadata,
Column('company_id', Integer, primary_key=True),
Column('company_name', String(255), nullable=False),
Column('income', Float, nullable=False),
Column('year', Integer, nullable=False),
)
id-123:value 123
我能够正确读取该文件,但是当我在控制台上打印时,我得到以下输出:
package demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class s {
public static void main(String[] args) throws Exception {
final String regex = ":[^\\d].*";
File file = new File("C:\\Users\\user\\Desktop\\file.txt");
String text, id;
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));
String line;
while ((line = reader.readLine()) != null) {
text = line.replaceAll("(^id-\\d*):+", "");
id = line.replaceAll(":\\S.*", "");
System.out.println(text);
System.out.println(id);
}
}
}
问号来自哪里?文本文件保存为UTF-8文件,读取也是UTF-8。试图在日食中运行它。
此外,在运行此行代码时,我得到了正确的输出?id-123:value 123
?id-123
:
value 123
但是从文件中读取相同行的相同正则表达式时,它会打印:
System.out.println(string.replaceAll("(^id-\\d*):+", ""));
有人可以帮帮我吗?
答案 0 :(得分:1)
问号来自哪里?文本文件保存为UTF-8文件,读取也是UTF-8。试图在日食中运行它。
这个错误花了我几个小时来弄清楚我的第一次尝试,但我很幸运能够弄明白。正如Aleksey在他的回答中提到的,这是因为在UTF-8编码文件的开头附加了BOM。
你问的是什么是Bom?
Bom,基本上字节顺序标记是添加到UTF-8编码文件开头的特殊字符。将文本解释为ISO-8859-1或CP1252的文本编辑器或Web浏览器将为此显示字符
。 BOM字符的唯一用途是向解析器或任何需要的源发出“我是一个unicode编码的文本流”,或者从包含可选BOM的流转换流。
您可以阅读有关BOM here的更多信息。此外,Aleksey的帖子中的链接问题也很好。
在你的情况下,你可以简单地使用一个漂亮的技巧来使程序工作。这不是最好的解决方案,但也不是最差的。
由于BOM字符只会附加在文件的开头,您只需检查该行是否以BOM字符
,\uFEFF
,0xFEFF
等开头。
if (line.startsWith("\uFEFF")) {
line = line.substring(1);
}
这将删除该行中的字符。此外,它只取决于您用于查看文本的编辑器。智能编辑器将忽略BOM。
更多阅读:
答案 1 :(得分:0)
问号来自哪里?
您的编辑器似乎将您的文件保存在" UTF-8中,并带有BOM"编码。例如,在Notepad ++编辑器中,您可以指定编码" UTF-8而不使用BOM"然后不会显示问号。
更多详情: