c# - 如何将 CSV 文件拆分为多个部分

标签 c# csv split memorystream

如何拆分从 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/

相关文章:

java - @Jacksonized 反序列化不适用于 mixin - "no String-argument constructor/factory method to deserialize from String value"

php - 如何从PHP中的csv文件中提取数据

python - 使用 split (' ' 拆分命令行是否有问题?

r - 如何根据R中列值的范围拆分数据帧?

C# - 按任意数量的制表符和空格拆分字符串

c# - LoadComponent() 与。 XamlReader.Load()?

c# - C# 中的散列和盐密码

c# - 微软报告服务。我应该使用网络服务作为数据源吗?

c# - 如何使用 RNGCryptoServiceProvider 生成桥牌?

csv - 如何在 WSO2 Micro Integrator 中跳过 CSV 文件中的标题