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 ファイルに保存したい (つまり、4001、3005、2100 のすべての行を 1 つの csv ファイルに格納し、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

おそらく、すべてのファイルに対して 1 つのクエリ:

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 に答える