基于值的不同CSV文件

时间:2013-10-11 13:59:53

标签: c# csv file-io

我对我的CSV有疑问。 我导出CSV并用C#读取。 CSV中每行的最后一个colomn是A,B,C,D,E或G. 现在,我希望我的CSV被切成碎片,比如;我想要一个新的CSV,其中的行包含A和D.另一个包含B和C,例如。

有人能指出我正确的方向吗?我被卡住了..

这是我的代码的一部分

StreamReader debtors = new StreamReader(@"C:\CSV\Debtors.csv");
StreamWriter debtorsMetaal = new StreamWriter(@"C:\CSV\DebtorsMetaal.csv");
StreamWriter debtorsSystemen = new StreamWriter(@"C:\CSV\DebtorsSystemen.csv");
StreamWriter debtorsHolding = new StreamWriter(@"C:\CSV\DebtorsHolding.csv");

while(debtors.Peek() >=0)
{
   string line = debtors.ReadLine();
   try
   {
     string[] rowsArray = line.Split(';');

    //..... etc

现在线条是碎片,但是如何选择我的行中的最后一个colomn并根据最后一个colomn的值创建一个新的CSV文件?

deborsMetaal,debtorsSystemen和debtorsHolding将成为新的CSV文件。

例如;

在CSV中的一行中,我有以下信息

number - name- description - type

其中type可以是A,B,C,D,E或G. 现在我想在一个CSV文件中将type = A的行和type = D的行放在一起。 这甚至可能吗?

值A,B,C,D,E或G始终采用excel格式的colomn AJ。

1 个答案:

答案 0 :(得分:2)

我会使用这样的循环:

var adLines = new List<string>();
var bcLines = new List<string>();
var unknownLines = new List<string>();
var adList = new[]{"A", "D"};
var bcList = new[]{"B", "C"};
using(var debtors = new StreamReader(@"C:\CSV\Debtors.csv"))
{
    string line = null;
    while((line = debtors.ReadLine()) != null)
    {
        string[] columns = line.Split(';'); // you should check if columns.Length is correct
        string lastColumn = columns.Last().Trim();
        if(adList.Contains(lastColumn, StringComparer.CurrentCultureIgnoreCase))
            adLines.Add(line);
        else if(bcList.Contains(lastColumn, StringComparer.CurrentCultureIgnoreCase))
            bcLines.Add(line);
        else
            unknownLines.Add(line);
    }
}
File.WriteAllLines(@"C:\CSV\DebtorsSystemen.csv", adLines);
File.WriteAllLines(@"C:\CSV\DebtorsHolding.csv", bcLines); 

但是,一般来说,你不应该重新发明轮子并使用可用的CSV解析器,如:

http://www.codeproject.com/Articles/9258/A-Fast-CSV-Reader