C#流读取器读取空白并绕过它们
我正在创建一个程序,读取一个文本文件并获取数据,然后将其放入数组。我的问题是,有一个列的目的是空的,但空白值必须仍然被视为一个值,但是当我的程序读取空白列时,它会读取下一个值,并将其放入值为0或空白的数组中。我试图计算每列之间的空格,以使其成为一个条件,但由于数据长度不同,空格不可靠。你知道我该怎么做吗 下面是我的文本数据的样子C#流读取器读取空白并绕过它们,c#,streamreader,C#,Streamreader,我正在创建一个程序,读取一个文本文件并获取数据,然后将其放入数组。我的问题是,有一个列的目的是空的,但空白值必须仍然被视为一个值,但是当我的程序读取空白列时,它会读取下一个值,并将其放入值为0或空白的数组中。我试图计算每列之间的空格,以使其成为一个条件,但由于数据长度不同,空格不可靠。你知道我该怎么做吗 下面是我的文本数据的样子 Data1 Data2 Data3 1.325 1.57 51.2 2.2 21.85 12.5
Data1 Data2 Data3
1.325 1.57 51.2
2.2 21.85
12.5 25.13
15.85 13.78 1.85
我需要我的数组看起来像这样
firstRow['1.325','1.57','51.2'];
secondRow['2.2','0','21.85'];
如果您的文件是
tab
-拆分的,请使用line.Split(“\t”)
获取每行的子字符串数组。然后,可以将每个子字符串转换为数据类型。在您的情况下,它必须是可空的,例如,decimal?
如果您有一个标题列表,按照它们在数据中的显示顺序排列,并且如果您的值始终与标题对齐,那么这是一个起点
import io, csv, sys
data = '''\
Data 1 Data 2 Data 3
1.325 1.57 51.2
2.2 21.85
12.5 25.13
15.85 13.78 1.85
'''
headers = ['Data 1', 'Data 2', 'Data 3'] # order should match headers
f = io.StringIO(data)
h = f.readline()
indexes = [h.find(s) for s in headers]
rows = []
for line in f:
line = line[:-1] # strip trailing linefeed
d = {}
for key, index in list(zip(headers, indexes))[::-1]: # slice from the right
val = line[index:]
line = line[:index]
d[key] = val.strip()
rows.append(d)
writer = csv.DictWriter(sys.stdout, headers)
writer.writeheader()
writer.writerows(rows)
因为我已经用完了时间,我所做的就是计算空格的数量,如果空格超过了一个数字(在我的例子中是10),我将在数组中添加一个空值
string[] lsData = pData.Split(' ');
string[] lsData1 = new string[18];
int newArrayData = 0;
int spaceCounter = 0;
for (int i = 0; i < lsData.Length; i++)
{
if (lsData[i] != "")
{
lsData1[newArrayData] = lsData[i];
newArrayData++;
spaceCounter = 0;
}
else
{
spaceCounter++;
}
if (spaceCounter >= 10)
{
lsData1[newArrayData] = "";
newArrayData++;
spaceCounter = 0;
}
}
string[]lsData=pData.Split(“”);
字符串[]lsData1=新字符串[18];
int newArrayData=0;
int spaceCounter=0;
for(int i=0;i=10)
{
lsData1[newArrayData]=“”;
newArrayData++;
空间计数器=0;
}
}
除非列长度是固定的或值由某些字符(如逗号)分隔,否则它是高度不可预测的。如果您可以控制该文件,请尝试使用CSV格式生成该文件,使用标题起始偏移量作为列绝对偏移量(“Datax”的每个“D”),并将它们之间的距离作为绝对列宽。然后,对于下一行,使用substring函数进行拆分。这是一个棘手的问题,如果可能的话,您可以将数据更改为csv格式。但是,如果这是您所拥有的全部,您需要计算出列的最大宽度,并通过计算空格,因为数据的长度不同
,如果无法确定空格数是否代表数据中的间隙,无法执行此操作。标题是否总是像这样Data1 Data2 Data3
?它没有选项卡拆分:(