0

我想逐行阅读我在红色下划线的每一列。你们可以看到的列值由几个空格分隔。例如,从第一行开始,我只想读取“1”,然后是“MANDIT”,然后是“CLIENT”等。问题是值之间的间距不是恒定的。

在此处输入图像描述

这是我的代码:(有明显的语法问题)

  StreamReader myReader = new StreamReader(Path)
  String line = “ “;
  for (int i =0; i <15; i++)
  {
     line = myReader.readLine();
     string[] delimiters = new string[] { ‘ ’,‘  ’,‘   ’,‘    ’ };
     // Accomodating for different sizes of spaces - is this right?

     int[] columnValues = line.Split(delimiters)
  }

“stringt [] columnValues = line.Split(delimteres) 有效吗?我在数据中有双精度和整数,不仅是字符串

多谢你们

4

4 回答 4

3

仔细查看您的图像,很明显您有一个包含固定长度列的文件。
最好的方法应该是为所需的每一列设置一个长度和位置数组。然后读取该行并使用 Substring 方法提取每一列。

例如,假设您只对从数组指示的位置开始pos并且长度由len数组指示的 4 列感兴趣

int pos[] = new int[] {0, 50, 100, 150};
int len[] = new int[] {3, 40, 20, 15};
....

string[] values = new string[4];
string line;
while((line = myReader.ReadLine()) != null)
{
   values[0] = line.Substring(pos[0], len[0]);
   values[1] = line.Substring(pos[1], len[1]);
   values[2] = line.Substring(pos[2], len[2]);
   values[3] = line.Substring(pos[3], len[3]);

   .... now convert the values and store or use them ....
}
于 2013-09-27T17:10:56.740 回答
2

我认为这会很困难,因为您的字段中可以包含空格,例如:“公司代码”。因此,除非列之间有 '\t' 制表符,并且您的字段不能包含制表符,否则您可能找不到好的分隔符。

如果你的第三列永远不会有#s,而你的第四列总是以#开头,那么你可以阅读直到你达到一个数字并修剪末端的空白。

备择方案:

如果您偶然从另一个程序获得此输出,您可以使用 C# 和 powershell 将其输出通过管道传输到您的程序中,然后管道机制将为您处理列拆分,您将收到一个对象列表,其中每个对象都是指定的线。

或者,您要阅读的文件看起来可能是 csv。您可以让任何程序产生该输出,而不是将其输出为 csv 吗?如果是这样,那么你有你的分隔符。

于 2013-09-27T17:11:24.863 回答
0

我有一个类似的问题,并得到了以这种方式解决它的建议:

StreamReader myReader = new StreamReader(Path)
String line = “ “;
for (int i =0; i <15; i++)
{
    line = myReader.ReadLine();
    char[] delimiters = new char[] {' ', '\t'};
    string[] columnValues = line.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
}  
于 2014-06-03T07:12:10.433 回答
-1

仅根据空间分割线。

string[] Read = line.Split(' ');

你会得到一个字符串数组。对于此字符串数组中的每个非 null 或空项目,将按从左到右的顺序为列值。

于 2013-09-27T17:11:32.160 回答