根据值分隔csv文件

时间:2013-02-04 15:09:33

标签: c# csv

请考虑使用半结肠分隔csv。

27356456;2;4001;3005;2100;20130125;
27356457;2;4001;3005;2100;20130125;
27356458;2;4001;3005;2100;20130125;
27356459;2;4002;3005;2100;20130125;
27356460;2;4002;3005;2100;20130125;
27356461;2;4006;3006;2104;20130125;
27356462;2;4006;3006;2104;20130125;
27356463;2;4006;3006;2104;20130125;
27356464;2;4006;3006;2104;20130125;

我想根据位置2,3和4的值将上面的行存储在单独的csv文件中(即一个csv文件中的所有行为4001,3005,2100,另一个文件中的所有行为4002,3005,2100,以及另一个文件中包含4006,3006和2104的所有行。)

这些位置的值可能会因实际数据而异。我认为可以通过Linq或?任何暗示都将受到赞赏。

private void ProcessTextFile(FileInfo csvFile)
{
  using (StreamReader sr = new StreamReader(csvFile.FullName, Encoding.UTF8))
  {
    while (sr.Peek() >= 0)
    {
       string line = sr.ReadLine();
       string[] words = line.Split(";");
       ...
    }
  }
}

3 个答案:

答案 0 :(得分:0)

您只需要为每个文件创建一个唯一的密钥...类似于......

string fileKey = string.Format("{0}.{1}.{2}", words[2], words[3], words[4]);

只需根据发现的fileKey附加到新文件。

string filePath = @"C:\output\" + fileKey + ".csv";
File.AppendAllText(filePath, line);

答案 1 :(得分:0)

var pathTemplate = @"C:\PrepareImport\{0}\{1}\{2}\filename.csv";
File.ReadAllLines(fileName)
    .GroupBy(x => x.Split(';').Skip(2).Take(3))
    .ToList()
    .ForEach(x => File.AppendAllLines(
        string.Format(pathTemplate, x.Key[0], x.Key[1], x.Key[2]), x));

答案 2 :(得分:0)

也许对于所有文件一个查询:

var allCsv = Directory.EnumerateFiles(dir, "*.csv")
    .Select(path => new
    {
        Path = path,
        Lines = File.ReadLines(path)
            .Select(l => new { Split = l.Split(';')})
            .Where(x => x.Split.Length >= 6)
            .Select(x => new { 
                Columns= x.Split
                    .Where((s, i) => i >= 2 && i <= 4) 
                    .ToList()
            }).ToList()
    })
    .ToList();

// now you have all you need:
foreach (var csv in allCsv)
    foreach(var csvLine in csv.Lines)
        Console.WriteLine("File:{0} Columns:{1}", csv.Path, string.Join(",", csvLine.Columns));

编辑:我必须承认,这是Linq不再可读的地方):