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?

C# and the CSV file

从您的问题听起来,您的数据不太适合平面文件格式,或者至少不适合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;
    }
}