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

本文关键字:CSV 文件 合并 | 更新日期: 2023-09-27 18:26:47

我试图合并两个具有不同标头的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#合并具有不同标头的CSV文件

您必须一行接一行地连接它们,而不是一个接一个。在框架中没有内置的方法来实现这一点,所以您必须自己编写代码。

您的主要问题是处理文件的行数不相同的情况。如果保证他们总是这样,那么操作相对简单。下面是一些类似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.Linqusing语句来包含它),它将两个枚举连接在一起,一次一个项,就像拉链一样。它将每一行传递到您提供的执行联接的函数中——在本例中为(f, s) => string.Join(",", f, s)

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

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

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

尝试以下

string separator = ","; //Change this to whatever column separator you want.
var file1 = File.ReadLines(@"C:'file1.csv");
var file2 = File.ReadLines(@"C:'file2.csv");
File.WriteAllLines(@"C:'file2.csv", file1.Zip(file2, (f1, f2) => f1 + separator + f2);

首先使用File.ReadLines会产生一个IEnumerable<string>,当你迭代文件时,它会读取文件的每一行。然后,Enumerable.Zip扩展方法允许你根据每个枚举中的相对位置将两个枚举连接起来。最后,File.WriteAllLines将迭代Zip的结果,并将每一行写入文件。

还要注意,如果文件的行数不相同,则Zip的结果将在到达其中一个文件的末尾时停止。