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#的伪代码,它说明了简单的解决方案:
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
语句来包含它),它将两个枚举连接在一起,一次一个项,就像拉链一样。它将每一行传递到您提供的执行联接的函数中——在本例中为(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
的结果将在到达其中一个文件的末尾时停止。