我写了一个小代码打开文件,我的文件内容如下,每行长度为94个字符,行终止符为\ r和\ n
101 111111111 1111111111010190542A094101
9000000000001000000000000000000000000000000000000000000
//同样适合本文
101 111111111 1111111111010190608A094101
52001 1 1 CCD1 101019101019 1111000020000001
6201110000251 00000000011 1 0111000020000001
820000000100111000020000000000000000000000011 111000020000001
9000001000001000000010011100002000000000001000000000000
private void mnuOpen_Click(object sender, EventArgs e)
{
string strFilePath = string.Empty;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.FileName = string.Empty;
openFileDialog1.RestoreDirectory = true;
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
StreamReader sr = new StreamReader(strFilePath);
string str = string.Empty;
str = sr.ReadToEnd().Replace("\r", "").Replace("\n", "");
sr.Close();
if (str.Length % 94 == 0)
{
//Do some thing
}
}
但我没有在这里得到错误任何人都可以说明原因
答案 0 :(得分:2)
包含或排除换行符的是94个字符吗?字符串"a\r\nb"
长度为四个字符,而不是两个字符。根据完整文件内容验证行长度似乎有点脆弱。例如,文件可能以\r\n
对结束。我更愿意单独阅读这些行并验证每行的修剪长度。
<强>更新强>
您可以通过将内容与预期的行长度匹配来验证内容:
public static bool StringIsValid(string input, int expectedLineLength)
{
return input.Replace("\r\n", "").Length % expectedLineLength == 0;
}
// called like so:
if (StringIsValid(str, 94))
{
// do something
}
但这不是很准确。假设我们期待4个字符的字符串:
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 4); // returns true
看起来不错。但是,请考虑一下:
string input = "abcd\r\nabcd\r\nabcd";
bool isValid = StringIsValid(input, 6); // returns true
此也返回true,因为我们检查的唯一内容是字符串的总长度(删除换行符后)可以均匀分割为6 - 字符行。使用12个字符的字符串是可能的,但这并不意味着它实际上由6个字符长的行组成。因此,更好的方法是检查线的长度。您可以逐个读取这些行,验证它并将其添加到输出中,如果它没有问题:
private static bool LineHasCorrectLength(string line, int expectedLineLength)
{
return line.Length == expectedLineLength;
}
// usage:
using (StreamReader reader = File.OpenText("thefile.txt"))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
if (LineHasCorrectLength(line, 94))
{
// add to output
}
}
}
...或者你得到所有行,验证它们的长度,然后在它们验证OK(在这种情况下使用LINQ All
扩展方法)时使用它们:
private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
return lines.All(s => s.Length == expectedLineLength);
}
// usage:
string[] lines = File.ReadAllLines("thefile.txt");
if (LinesHaveCorrectLength(lines, 94))
{
// do something
}
更新2
根据您的评论,这应该适用于您的代码(使用上面示例代码中的LinesHaveCorrectLength
方法,只有当所有行都具有预期长度时才会返回true
:
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
strFilePath = openFileDialog1.FileName;
string[] lines = File.ReadAllLines(strFilePath);
if (LinesHaveCorrectLength(lines, 94))
{
// add lines to grid
}
}
更新3
非LINQ版本的LinesHaveCorrectLength
:
private static bool LinesHaveCorrectLength(string[] lines, int expectedLineLength)
{
foreach (string item in lines)
{
if (item.Length != expectedLineLength)
{
return false;
}
}
return true;
}
答案 1 :(得分:1)
我的第一次尝试是File.ReadAllLines
并且稍后会担心线路长度。
答案 2 :(得分:0)
您没有收到错误,因为没有任何错误。但是,您需要处理str.Length % 94 != 0
的情况,因为ReadToEnd
将在字符串中包含换行符,这就是mod 94
没有完成工作的原因。另一种方法是读取每一行(ReadLine
)并检查长度。 ReadLine
会删除换行符。
答案 3 :(得分:0)
这个适用于我
while (sr.Peek() >= 0)
{
str = sr.ReadLine().Replace("\r", "").Replace("\n", "");
length += str.Length;
}