csv文件合并或分割

在我们的日常工作和学习中,如果想要将多个CSV合并成一个CSV文件,或者将一个CSV分割成多个CSV文件,该怎么操作呢?今天我给带大家带来一个程序,可以快速实现csv文件的合并或分割,希望对你的工作有所帮助。

1、CSV文件合并

合并CSV最快的方法是使用批处理进行操作,只需要当前文件夹下创建一个bat程序,里边写上COPY *.CSV ALL.CSV,即可快速将这些文件合并到ALL.CSV中,因为系统没有读取这些CSV文件内容,合并起来超快。那么,如何用C#程序实现此效果呢?

在程序上上半部分,为CSV合并区域,可以将多个CSV文件合并成一个文件保存在原目录下的ALL.CSV文件中,但是由于csv的编码问题,为避免乱码,需要分开进行合并。

csv文件合并或分割_第1张图片

合并后的提示:

csv文件合并或分割_第2张图片

2、CSV文件分割

如果有一个超过了100万行的csv文件,用默认Excel程序打开后,将会提示数据长度超过工作表外,超过的部分将被丢失。那么如何将一个CSV文件按行数分割成多个CSV文件呢?

在程序的下半部分,可以将1个较大的CSV文件按行分割为多个CSV文件,目前仅支持UTF8格式的CSV文件,ANSI格式的文件分割后中文会出现乱码。可使用另一篇文章中的工具转换csv文件的编码格式。

分割后的提示:

csv文件合并或分割_第3张图片

代码部分

CSV文件合并代码:

OpenFileDialog dialog = new()
{
    //该值确定是否可以选择多个文件
    Multiselect = true,
    //对话框标题
    Title = "请选择一个或多个UTF8格式的csv文件",
    //打开文件的类型
    Filter = "Files|*.csv"
};
if (dialog.ShowDialog() == DialogResult.OK)
{

    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

    int i = 0;
    foreach (string s in dialog.FileNames)
    {
        StreamReader reader = new(s);
        string? path = System.IO.Path.GetDirectoryName(s);
        string combinedFile = path + "/ALL.csv";

        List data = new();

        //using (StreamReader sr = new(s, Encoding.GetEncoding("GBK"))) ANSI格式用这一行
        using (StreamReader sr = new(s, Encoding.Default))
        {
            while (!sr.EndOfStream)
            {
                string[] lineData = sr.ReadLine().Split(','); // 假设以逗号分隔,你可以根据实际情况调整分隔符  
                data.Add(lineData);
            }
        }
        //return data;
        using (StreamWriter sw = new(combinedFile, true)) // 第二个参数true表示追加模式,而不是覆盖模式  
        {
            foreach (string[] line in data)
            {
                sw.WriteLine(string.Join(",", line)); // 使用逗号作为分隔符,你可以根据实际情况调整分隔符  
            }
        }
        i++;
    }
    MessageBox.Show("合并完成,共合并" + i + "个文件,存放在原目录下的ALL.csv文件中");

}

CSV分割代码


            OpenFileDialog dialog = new()
            {
                //该值确定是否可以选择多个文件
                Multiselect = false,
                //对话框标题
                Title = "请选择需要分割的csv文件",
                //打开文件的类型
                Filter = "Files|*.csv"
            };
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                string inputFilePath = dialog.FileName;

                //获取保存路径
                string? outputFolderPath = System.IO.Path.GetDirectoryName(dialog.FileName);
                //获取原文件名称
                string? filename = System.IO.Path.GetFileNameWithoutExtension(dialog.FileName);


                int fileCount = 0;
                int rowCount = 0;
                int rowsPerFile = 0;
                if (comboBox1.Text == "100万")
                {
                    rowsPerFile = 1000000;
                }
                else if (comboBox1.Text == "50万")
                {
                    rowsPerFile = 500000;
                }
                else if (comboBox1.Text == "10万")
                {
                    rowsPerFile = 100000;
                }
                else if (comboBox1.Text == "1万")
                {
                    rowsPerFile = 10000;
                }

                using (StreamReader reader = new(inputFilePath))
                {
                    string line;
                    string[] headers = null;

                    while ((line = reader.ReadLine()) != null)
                    {
                        if (headers == null)
                        {
                            headers = line.Split(',');
                        }
                        else
                        {
                            if (rowCount % rowsPerFile == 0)
                            {
                                fileCount++;
                                string outputFilePath1 = System.IO.Path.Combine(outputFolderPath, $"{filename}_{fileCount + 1}.csv");
                                using StreamWriter writer = new(outputFilePath1);
                                writer.WriteLine(string.Join(",", headers));
                            }

                            string[] values = line.Split(',');
                            string outputFilePath = System.IO.Path.Combine(outputFolderPath, $"{filename}_{fileCount + 1}.csv");
                            using (StreamWriter writer = new(outputFilePath, true))
                            {
                                writer.WriteLine(line);
                            }
                        }

                        rowCount++;
                    }
                    if (rowCount < rowsPerFile)
                    {
                        rowsPerFile = rowCount;
                    }
                }

                MessageBox.Show($"CSV文件已成功分割为 {fileCount + 1} 个文件,每个文件包含 {rowsPerFile} 行。");
            }
        }

希望对大家有帮助。

你可能感兴趣的:(c#,经验分享,个人开发)