Я застрял в проблеме, когда мне нужно разделить файл с фиксированной шириной. Каждое поле можно идентифицировать по его первому символу.
Файл содержит несколько форматов, например, формат первой строки — {1, 11, 12}, а формат второй строки — {1, 10, 12}. Оба отождествляются с первым символом.
AFirstField SecondFields
BBField SecondFields
Однако иногда в строке может быть меньше символов, как показано ниже.
AFirstField S
До сих пор я пробовал использовать анализатор текста, получая текущую строку и проверяя первый символ, чтобы определить формат, но приложение падает, потому что иногда в строках меньше данных, как в примере A выше.
string[] data;
using (TextFieldParser myReader = new TextFieldParser(filePath))
{
myReader.TextFieldType = FieldType.FixedWidth;
while (!myReader.EndOfData)
{
currentLine = myReader.ReadLine();
recordType = currentLine[0].ToString();
if (!recordType.Equals("H"))
{
myReader.FieldWidths = returnLineFormat();
myReader.HasFieldsEnclosedInQuotes = true;
data = myReader.ReadFields();
//if (recordType.Equals("R"))
//{
// ISD.Add(data);
//}
}
}
}
private int[] returnLineFormat()
{
int[] format = null;
if ((recordType == "A"))
{
format = new int[] { 1, 11, 12};
}
else if ((recordType == "B"))
{
format = new int[] { 1, 10, 12};
}
return format;
}
Это ошибки, которые я получаю из-за того, что в строке меньше материала: строка 3 не может быть проанализирована с использованием текущих значений ширины поля.
Есть ли способ обойти эту проблему?
format = new int[] { 1, 11, -1};
. Если есть шанс, что у вас будет пустая строка, вы можете также добавить условие послеmyReader.ReadLine()
, чтобы проверить это перед вызовом currentLine[0] или вы получите ошибку. - person C. Mitchell   schedule 16.10.2018