我有一个档案。当我在记事本中打开它时,我会看到一行中的字符串。但是,如果我在WordPad或Notepad++等任何其他应用程序中打开该文件。我可以看到charachters之间的不规则换行符,它们出现在多行中。如果我reader.Readline()
,也会出现这些换行符。如何在C#中执行类似行读取的记事本?
答案 0 :(得分:4)
这种差异通常是因为文件编码使用的模糊性。如果您希望文件正确解析,则需要使用正确的编码。什么字符导致问题?此外 - 如果所使用的编码中的字节不合法,则所有投注均关闭;-p
您可以在文件上创建(例如)StreamReader
时指定编码:
using (Stream stream = File.OpenRead(path))
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
发布base-64后,问题是该行中间的\r
。要将其作为基本字符串阅读,您可以使用:
byte[] data = File.ReadAllBytes(path);
string txt = Encoding.UTF8.GetString(data);
或只是:
string text = File.ReadAllText("foo.txt");
但是,显示此内容总是很困难。您现在可以在选择的行结尾处Split
(可能是crlf)。 StreamReader
正在拆分任何看起来像 行结尾的内容。
string[] lines = s.Split(new string[] {"\r\n"}, StringSplitOptions.None);
答案 1 :(得分:2)
很抱歉我的第二个回答,但我刚刚意识到你可以使用peek来获取下一个字符并检查当前和下一个是否是\ r \ n,如下:
var path = "c:/test.txt";
File.WriteAllText(path, "a\nb\r\nc");
using (var stream = File.OpenRead(path))
using (var reader = new StreamReader(stream, Encoding.ASCII))
{
var lineBuilder = new StringBuilder();
string line;
char currentChar;
int nextChar;
while (!reader.EndOfStream)
{
currentChar = (char)reader.Read();
nextChar = reader.Peek();
if (!(currentChar == '\r' && nextChar == '\n'))
{
lineBuilder.Append(currentChar);
}
if((currentChar == '\r' && nextChar == '\n') || nextChar == -1)
{
line = lineBuilder.ToString();
Console.WriteLine(line);
lineBuilder = new StringBuilder();
reader.Read();
}
}
}
答案 2 :(得分:0)
如果这不是那么重要,你可以加载所有文本并使用正则表达式将其拆分成行,
var path = "c:/test.txt";
File.AppendAllText(path, "lala\nlala\nlalal");
var text = File.ReadAllText(path);
Console.WriteLine(Regex.Split(text, Environment.NewLine).Length);
答案 3 :(得分:0)
使用
String[] lines = File.ReadAllLines("c:\\text.txt");
一次性提取所有行