在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行将被忽略,子字符串也将被忽略。
假设您的意思是"固定列",并且每个非终端列的宽度完全相同,每个列之间只分隔一个空格,是的,您可以不使用正则表达式或子字符串。如果是这样的话——请记住,这也表明数据库中的每一个人都有一个正好四个字母长的名字——那么你可以逐行读取文件。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(),您可以使用其他几个选项:
- String.Split,例如
var columns = line.Split(' ');
- 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++;
}