请考虑使用半结肠分隔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(";");
...
}
}
}
答案 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不再可读的地方):