今天我发现了为什么会出现这个问题或者在使用C#ReadLine()从文本文件中逐行读取时出现此问题的原因。
问题:
假设文本文件中有3行。每个长度等于400.(手动计数) 从C#ReadLine()读取行并检查长度 Console.WriteLine(str.length); 我发现它打印出来了:
Line 1 => 400
Line 2 => 362
Line 3 => 38
Line 4 => 400
我很困惑,文本文件只有3行,为什么它的打印4也随着长度的变化而变化。然后我快速检查“\ n”或“\ r”或组合“\ r \ n”但我没有找到任何,但我发现的是2双引号ex => “abcd”,在第二行。
然后我改变了我的代码以打印线本身和男孩我很惊讶,我在控制台输出如下:
Line 1 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb
Line 2 > blablabbablablababalbalbablabal"blabablhabh
Line 3 > "albhalbahblablab
Line 4 > blahblahblabablabhlabhlabhlbhaabahbbhabhblablahblhablhablahb
现在我尝试使用替换函数删除双引号“”但是我得到相同的4行结果只是没有双引号。
现在请告诉我除手动编辑以外的任何解决方案以克服此情况。 这是我的代码简单代码:
static void Main(string[] args)
{
FileStream fin;
string s;
string fileIn = @"D:\Testing\CursedtextFile\testfile.txt";
try
{
fin = new FileStream(fileIn, FileMode.Open);
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message + "Cannot open file.");
return;
}
StreamReader fstr_in = new StreamReader(fin, Encoding.Default, true);
int cnt = 0;
while ((s = fstr_in.ReadLine()) != null)
{
s = s.Replace("\""," ");
cnt = cnt + 1;
//Console.WriteLine("Line "+cnt+" => "+s.Length);
Console.WriteLine("Line " + cnt + " => " + s);
}
Console.ReadLine();
fstr_in.Close();
fin.Close();
}
注意:我试图阅读并上传37个文本文件,每个500 MB的金融域,我总是面临这个问题,并且必须手动进行更改。 :(
答案 0 :(得分:0)
如果问题是:
然后你可以解决此问题,但解决此问题的最佳和可能最正确方法是转到源代码,修复首先写出这个格式错误的文件的程序。
但是,这是一个LINQPad程序,用空格替换单个换行符或回车符:
void Main()
{
string input = "this\ris\non\ra\nsingle\rline\r\nThis is on the next line";
string output = ReplaceLoneLineBreaks(input);
output.Dump();
}
public static string ReplaceLoneLineBreaks(string input)
{
if (string.IsNullOrEmpty(input))
return input;
var result = new StringBuilder();
int index = 0;
while (index < input.Length)
{
switch (input[index])
{
case '\n':
if (index == input.Length - 1 || input[index+1] != '\r')
{
result.Append(' ');
index++;
}
else
{
result.Append(input[index]);
result.Append(input[index + 1]);
index += 2;
}
break;
case '\r':
if (index == input.Length - 1 || input[index+1] != '\n')
{
result.Append(' ');
index++;
}
else
{
result.Append(input[index]);
result.Append(input[index + 1]);
index += 2;
}
break;
default:
result.Append(input[index]);
index++;
break;
}
}
return result.ToString();
}
答案 1 :(得分:0)
如果线条长度相同,则按行长分割线条,而不是观察行尾。
const int EndOfLine = 2; // CR LF or = 1 if only LF.
const int LineLength = 400;
string text = File.ReadAllText(path);
for (int i = 0; i < text.Length - EndOfLine; i += LineLength + EndOfLine) {
string line = text.Substring(i, Math.Min(LineLength, text.Length - i - EndOfLine));
// TODO Process line
}
如果最后一行未被行尾字符终止,请删除两个- EndOfLine
。
Math.Min
部分也只是一种安全措施。如果没有行短于400,则可能没有必要。