Это 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;
}