我正在尝试合并两个具有不同标题的 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/