C# 合并具有不同 header 的 CSV 文件

标签 c# csv merge

我正在尝试合并两个具有不同标题的 csv 文件。当我这样做时,第二个文件添加到 csv 文件的底部而不是它的“右侧”。 例如。 文件 1 的标题为(每列中都有数据) A 栏、B 栏、C 栏 文件 2 的标题为(每列中都有数据) F 栏,F 栏,F 栏

合并文件 1 后我希望它能够读取

列 A、b、c、d、e、f

列数据

(每列中都有相应的数据)但我的合并是将其添加到文件的底部,所以它读起来像

a、b、c

文件1的数据

d、e、f

文件2的数据

当我在 C# 中做我想做的事情时

string file1 = File.ReadAllText(@"C:\file1.csv");
        string file2 = File.ReadAllText(@"C:\file2.csv");
        File.WriteAllText(@"C:\file2.csv", string.Concat(file1, file2));

File.AppendAllText(@"C:\file1.csv", file2);

或使用流读取器

StreamWriter wtr = new StreamWriter(@"C:\file1.csv");
wtr.Write(file1 + "\t" + file2); //tried different variations with this one
wtr.Close();
wtr.Dispose();

都给了我同样的结果,但没有任何快乐。

任何帮助将不胜感激。

最佳答案

你必须一行一行地加入,而不是一个接一个。框架中没有内置方法可以执行此操作,因此您必须自己编写代码。

您的主要问题是处理文件行数不同的情况。如果保证他们一直有这个,那么操作就相对简单了。下面是一些类似 C# 的伪代码,说明了简单的解决方案:

var first = File.ReadAllLines("firstfile.csv");
var second = File.ReadAllLines("secondfile.csv");
var result = first.Zip(second, (f, s) => string.Join(",", f, s));
File.WriteAllLines("combined.csv", result);

File.ReadAllLines 返回一个字符串数组,每行一个。您可以通过这种方式轻松读入文件并将其分成单独的行。

.Zip 是一个 Linq 扩展方法(您必须通过在 System.Linq 的顶部添加 using 语句来包含它。文件)将两个可枚举连接在一起,一次一个项目,就像 zipper 一样。它将每一行传递到您提供的执行连接的函数中 - 在本例中为 (f, s) => string.Join(",", f, s)

string.join 是连接由静态文本分隔的字符串的便捷方法。在本例中,文本是逗号“,”。它在其他情况下更有用,但我在这里使用它是因为我可以。

并且File.WriteAllLines将可枚举字符串的内容写入文件。

现在,如果您必须处理可枚举长度不同的情况,则必须逐步遍历每个集合的每一行,并将它们手动连接到输出集合中,并为丢失的数据添加空列。这有点复杂,但可以完成。如果您必须处理这种情况,请自己尝试一下,如果遇到问题,请回来并使用代码中的详细信息提出新问题。

关于C# 合并具有不同 header 的 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34270458/

相关文章:

c# - C#修改多个词典值会引发错误

c# - 从头开始创建文本/代码编辑器

javascript - "Error: <path> attribute d: Expected number"

javascript - 合并两个对象,如果第二个对象中不存在第一个对象的属性,则保留它们

git - git 中的硬 merge

c# - 为什么在将 Int64 转换为 Int32 时,C# 让我在没有任何错误或警告的情况下溢出,它是如何进行转换的?

c# - 通过 JSON.NET 反序列化 Elasticsearch 结果

java - 是否有一个Java库可以根据CSV文件生成.java Bean文件?

php - 如果 csv 值为 null,则插入 null 或其他内容

sql-server - 对相同的源表和目标表使用 SQL Server MERGE 命令