0

请考虑以下用分号分隔的 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(";");
       ...
    }
  }
}
4

3 回答 3

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));
于 2013-02-04T15:17:56.663 回答
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);
于 2013-02-04T15:15:50.597 回答
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 不再可读的地方):

于 2013-02-04T15:32:59.543 回答