如何拆分从 URL 下载的 csv 文件?我正在尝试保留拆分的标题。
举个例子
A,B,C,D,E
1,2,3,4,5
12,11,8,7,6
23,23,34,1,0
23,23,32,1,0
转换为
A,B,C,D,E
1,2,3,4,5
12,11,8,7,6
A,B,C,D,E
23,23,34,1,0
23,23,32,1,0
下面的代码用于检索 URL 文件:
MemoryStream file = GetStreamFromUrl(invoiceAPI);
private static MemoryStream GetStreamFromUrl(string url)
{
MemoryStream stream = new MemoryStream();
WebClient wc = new WebClient();
using (MemoryStream streamDownload = new MemoryStream(wc.DownloadData(url)))
{
stream = streamDownload;
}
return stream;
}
我如何能够拆分 csv 文件并保留标题,并且文件具有动态长度,例如,我可以将其拆分为仅 10 行,因为我将上传它以用于另一组。你能告诉我如何做并解释一下吗?
最佳答案
这是一个使用 CsvHelper
的实现NuGet 包。
首先创建一个 Row
类来映射 CSV 列:
public class Row {
public int A { get; set; }
public int B { get; set; }
public int C { get; set; }
public int D { get; set; }
public int E { get; set; }
public override string ToString()
{
return $"A={A},B={B},C={C},D,={D},E={E}";
}
}
然后你可以创建一个方法,接受你想要读取的 CSV 文件的源路径,以及新 CSV 文件应该去的输出路径。您还需要指定要分块到每个文件中的行数。在这种情况下是两个。该方法肯定可以改进并处理错误检查,但它显示了总体思路。
private static void SplitCsv(string source, string dest, int numRows)
{
// Open CSV file for reading
using (var fileReader = File.OpenText(source))
{
using (var csv = new CsvReader(fileReader))
{
// Collect all rows
var rows = csv
.GetRecords<Row>()
.ToList();
// Iterate rows in chunks
for (var row = 0; row < rows.Count() / numRows; row++)
{
// Extract chunks using LINQ
var fileRows = rows
.Skip(row * numRows)
.Take(numRows);
// Create output path
var outputPath = Path.Combine(dest, $"file{row}");
// Write chunk to file
using (var writer = new StreamWriter(outputPath,
false,
System.Text.Encoding.UTF8))
{
using (var csvFile = new CsvWriter(writer))
{
csvFile.WriteRecords(fileRows);
}
}
}
}
}
}
生成以下文件:
file0.txt
A,B,C,D,E
1,2,3,4,5
12,11,8,7,6
file1.txt
A,B,C,D,E
23,23,34,1,0
23,23,32,1,0
关于c# - 如何将 CSV 文件拆分为多个部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58601520/