在C#中使用固定列的Eead文本文件

本文关键字:Eead 文本 文件 | 更新日期: 2023-09-27 18:28:34

有没有任何方法可以在不使用正则表达式和子字符串的情况下读取C#中具有固定列的文本文件?

我想读取一个具有固定列的文件,并将该列转移到excel文件(.xlsx)

示例1

普科普考2010年慕尼黑AC 78.507AC 15.100Rio Branco AC 336.038Sena Madureira AC 38.029

示例2

普科普考2010年慕尼黑AC 78.507Epitaciolândia AC 15.100Rio Branco AC 336.038Sena Madureira AC 38.029

记住,我有第二个例子中的一个列为空的情况,我可以获得列和值​​使用regex和/或子字符串,但如果它在示例2中显示为文件,则文件的regex行将被忽略,子字符串也将被忽略。

在C#中使用固定列的Eead文本文件

假设您的意思是"固定列",并且每个非终端列的宽度完全相同,每个列之间只分隔一个空格,是的,您可以不使用正则表达式或子字符串。如果是这样的话——请记住,这也表明数据库中的每一个人都有一个正好四个字母长的名字——那么你可以逐行读取文件。Id为line[0].ToString(),名称为new string(new char[] { line[2], line[3], line[4], line[5])等。

或者,对于任何给定的值:

var str = new StringBuilder();
for (int i = firstIndex; i < lastIndex; i++)
{
    str.Append(line[i]);
}

但这基本上只是在执行Substring的精确功能。子字符串不是你的问题-处理第一列(城市)中的空值是。因此,对于任何给定的行,你都需要检查该行是否为空:

foreach (line in yourLines)
{
    if (line.Substring(cityStartIndex, cityEndIndex).IsNullOrWhitespace) == "")
    {
        continue;
    }
}

或者,如果你确定城市名称将始终位于该行的第一个索引:

foreach (line in yourLines)
{
    if (line[0] == ' ') { continue; }
}

如果您从城市单元格中获得的值是有效的,那么您将存储该值,并继续使用Substring和行中其他值的索引。

如果出于任何原因不想使用正则表达式或Substring(),您可以使用其他几个选项:

  1. String.Split,例如var columns = line.Split(' ');
  2. Chars,使用每列的已知宽度来构建输出

为什么不直接使用string.Split()

类似于:

using (StreamReader stream = new StreamReader(file)) {
  while (!stream.EndOfStream) {
    string line = stream.ReadLine();
    if (string.IsNullOrWhitespace(line))
      continue;
    string[] fields = line.Split((char[])null, StringSplitOptions.RemoveEmptyEntries);
    int ID = -1, age = -1;
    string name = null, training = null;
    ID = int.Parse(fields[0]);
    if (fields.Length > 1)
      name = fields[1];
    if (fields.Length > 2)
      age = int.Parse(fields[2]);
    if (fields.Length > 3)
      training = fields[3];
    // do stuff
  }
}

唯一的缺点是它将允许任意长度的字段。田地里的空格会打破田地。

至于在最后一种情况下被忽略的正则表达式,请尝试以下操作:

Match m = Regex.Match(line, @"^(.{2}) (.{4}) (.{2})( +.+?)?$");

First-为文件中的每一列定义一个变量。然后逐行遍历文件,并将每一列分配给正确的变量。替换正确的起始位置和长度。这些信息应该足以让您开始解析文件。

private string id;
private string name;
private string age;
private string training;
while((line = file.ReadLine()) != null)
{
    id = line.Substring(0, 3)
    name = line.Substring(3, 10)
    age = line.Substring(12, 2)
    training = line.Substring(14, 10)
    ...
    if (string.IsNullOrWhiteSpace(name))
    {
        // ignore this line if the name is blank
    }
    else
    {
        // do something useful
    }
    counter++;
}