C# and the CSV file
本文关键字:file CSV the and | 更新日期: 2023-09-27 18:07:33
我使用c#, streamreader和writer格式化了这些数据,并创建了这个csv文件。下面是示例数据:
A------B-C---D----------E------------F------G------H-------I
NEW, C,A123 ,08/24/2011,08/24/2011 ,100.00,100.00,X123456,276135
NEW, C,A125 ,08/24/2011,08/24/2011 ,200.00,100.00,X123456,276135
NEW, C,A127 ,08/24/2011,08/24/2011 , 50.00,100.00,X123456,276135
NEW, T,A122 ,08/24/2011,08/24/2011 , 5.00,100.00,X225511,276136
NEW, T,A124 ,08/24/2011,08/24/2011 , 10.00,100.00,X225511,276136
NEW, T,A133 ,08/24/2011,08/24/2011 ,500.00,100.00,X444556,276137
I would like the following output:
NEW, C,A123 ,08/24/2011,08/24/2011 ,100.00,100.00,X123456,276135
NEW, C,A125 ,08/24/2011,08/24/2011 ,200.00,100.00,X123456,276135
NEW, C,A127 ,08/24/2011,08/24/2011 , 50.00,100.00,X123456,276135
NEW, C,A001 ,08/24/2011,08/24/2011 ,350.00,100.00,X123456,276135
NEW, T,A122 ,08/24/2011,08/24/2011 , 5.00,100.00,X225511,276136
NEW, T,A124 ,08/24/2011,08/24/2011 , 10.00,100.00,X225511,276136
NEW, T,A001 ,08/24/2011,08/24/2011 , 15.00,100.00,X225511,276136
NEW, T,A133 ,08/24/2011,08/24/2011 ,500.00,100.00,X444556,276137
NEW, T,A001 ,08/24/2011,08/24/2011 ,500.00,100.00,X225511,276137
对于字段"I"的每次更改,我想添加一行,求和列F,在C中添加"A001",并将其他字段的内容复制到新添加的行中。
列上的字母仅作说明用途。没有头文件
首先,我应该先做什么?我如何将F列相加,复制所有字段的内容,并将"A001"添加到C中?我如何添加一行并复制字段w/每次更改I?
从您的问题听起来,您的数据不太适合平面文件格式,或者至少不适合CSV(类似于单个DB表)。想要"将其他字段的内容复制到新添加的行中"对我来说意味着可能存在一种关系,这种关系可能更好地表示为引用而不是将数据复制到新行。
还要记住根据列'F'求和的要求,这表明您需要遍历每一行以计算总和。
如果您决定采用CSV以外的路线,您可以尝试轻量级数据库解决方案,如SQLite。另一种选择可能是查看XmlSerializer或DataContract(带有Serializer),然后只处理代码中的对象。当您使用完这些对象后,可以将它们序列化到磁盘。
您可以使用自定义迭代器块,就像一个示例一样,这显示了如何添加包含"A001"C列的新行。您可以很容易地添加一个新的和列,但请记住,您应该保持每行中的列数相同。
public IEnumerable<string> GetUpdatedLines(string fileName)
{
int? lastValue = null;
foreach (string line in File.ReadLines(fileName))
{
var values = line.Split(',');
int myIValue = Convert.ToInt32(values[7]);
if (lastValue.HasValue && myIValue != lastValue)
{
//emit new line sum
values[2] = "A001";
yield return string.Join(",", values);
}
lastValue = myIValue;
yield return line;
}
}