在我们的日常工作和学习中,如果想要将多个CSV合并成一个CSV文件,或者将一个CSV分割成多个CSV文件,该怎么操作呢?今天我给带大家带来一个程序,可以快速实现csv文件的合并或分割,希望对你的工作有所帮助。
1、CSV文件合并
合并CSV最快的方法是使用批处理进行操作,只需要当前文件夹下创建一个bat程序,里边写上COPY *.CSV ALL.CSV,即可快速将这些文件合并到ALL.CSV中,因为系统没有读取这些CSV文件内容,合并起来超快。那么,如何用C#程序实现此效果呢?
在程序上上半部分,为CSV合并区域,可以将多个CSV文件合并成一个文件保存在原目录下的ALL.CSV文件中,但是由于csv的编码问题,为避免乱码,需要分开进行合并。
合并后的提示:
2、CSV文件分割
如果有一个超过了100万行的csv文件,用默认Excel程序打开后,将会提示数据长度超过工作表外,超过的部分将被丢失。那么如何将一个CSV文件按行数分割成多个CSV文件呢?
在程序的下半部分,可以将1个较大的CSV文件按行分割为多个CSV文件,目前仅支持UTF8格式的CSV文件,ANSI格式的文件分割后中文会出现乱码。可使用另一篇文章中的工具转换csv文件的编码格式。
分割后的提示:
代码部分
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<string[]> 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} 行。");
}
}
希望对大家有帮助。