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

有没有什么办法来阅读固定的列在C#中的文本文件,而不使用正则expression式和子string?

我想读取固定列的文件,并将列转移到Excel文件(.xlsx)

例子1

                                        POPULACAO 
 MUNICIPIO UF CENSO 2010 

                                     AC 78.507
                                     AC 15.100
 Rio Branco AC 336.038
 Sena Madureira AC 38.029 

例2

                                        POPULACAO 
 MUNICIPIO UF CENSO 2010 

                                     AC 78.507
 EpitaciolândiaAC 15.100
 Rio Branco AC 336.038
 Sena Madureira AC 38.029

记住我有一个例子,在第二个例子中,列是空的,我可以使用正则expression式和/或子string获取列和值,但是如果它在例2中显示为一个文件,该文件被忽略,所以子string。

假设你的意思是“固定列”的字面意思,并且每一个非终结列是完全相同的宽度,每列只有一个空格分隔,是的,你可以逃脱使用正则expression式或子string。 如果是这样的话 – 记住这也意味着数据库中的每一个人都有一个长度只有四个字母的名字 – 那么你可以直接读取文件。 Id将是line[0].ToString() ,name将是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的确切function。 子串不是你的问题 – 处理第一(城市)列的空值是。 所以,对于任何给定的行,你需要检查行是否是空的:

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

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

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

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

如果由于某种原因你不想使用正则expression式或者Substring(),你可以使用其他一些选项:

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

为什么不使用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 } } 

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

至于在最后一种情况下被忽略的正则expression式,请尝试如下所示:

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

首先 – 为文件中的每一列定义一个variables。 然后逐行浏览文件,并将每列分配给正确的variables。 replace正确的起始位置和长度。 这应该是足够的信息,让你开始parsing你的文件。

 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++; }