繁体   English   中英

水平合并CSV文件

[英]Combining csv files horizontally

我有一个要用C#完成的小项目,我不是专家,但是我无法为我要尝试的工作找到其他解决方案,所以也许我只是不知道要寻找什么。

我有几个这样的csv文件;

  | AColumn  | BColumn
--+----------+---------
1 | Title    |
--+----------+---------
2 | Year     |
--+----------+---------
3 | Heading1 | Heading2
--+----------+---------
4 | DATA1    | DATA2

我想做的是(我不确定是否可以)将它们合并在一起,但将信息水平附加。

例如,追加两个如下所示;

  | AColumn  | BColumn  | CColumn  | Dcolumn
--+----------+----------+----------+---------
1 | Title    |          |          |
--+----------+----------+----------+---------
2 | Year     |          |          |
--+----------+----------+----------+---------
3 | Heading1 | Heading2 | Heading3 | Heading4 
--+----------+----------+----------+---------
4 | DATA1    | DATA2    | DATA3    | DATA4

我已经成功地从第一个文件中删除了标题和年份,但将其他文件添加到了底部。

希望这是足够的信息,但是如果您需要,我可以添加更多信息。

using System;
using System.IO;
using System.Linq;
using System.Windows.Forms;


class Program
{
    [STAThread]
    public static void Main(string[] args)
    {
        FolderBrowserDialog folderBrowserDialog1 = new FolderBrowserDialog
        {
            ShowNewFolderButton = false
        };

        string selectedFolder = @"C:\";
        folderBrowserDialog1.SelectedPath = selectedFolder;

        //If OK is pressed
        if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
        {
            //Grab the folder that was chosen
            selectedFolder = folderBrowserDialog1.SelectedPath;
            //get all csv files
            string[] filepaths = Directory.GetFiles(selectedFolder, "*.csv");
            //create combined directory
            Directory.CreateDirectory(selectedFolder + "\\Combined\\");
            //define it as destination folder
            string destinationFolder = selectedFolder + "\\Combined\\";
            //define destination file name
            string destinationFile = "Combined.csv";

            StreamWriter fileDest = new StreamWriter(destinationFolder + destinationFile, true);
            for (int i = 0; i < filepaths.Length; i++)
            {
                try
                {
                    string file = filepaths[i];
                    string[] lines = File.ReadAllLines(file);
                    if (i > 0)
                    {
                        lines = lines.Skip(1).ToArray(); // Skip header row for all but first file
                    }

                    foreach (string line in lines)
                    {
                        fileDest.WriteLine(line);
                        Console.WriteLine(file);
                    }
                }

                catch (Exception)
                {
                    //nothing so far
                }
            }
            fileDest.Close();
            Console.Write("Press Enter to close");
            Console.ReadLine();
        }
    }
}

这是简单的解决方案:

// first put data of all files in a list:
List<string[]> fileData = new List<string[]>();
for (int i = 0; i < filepaths.Length; i++)
{
    string file = filepaths[i];
    string[] lines = File.ReadAllLines(file);
    fileData.Add(lines);
}
//then combine them horizontally in another list
List<string> combined = new List<string>();
var maxCount = fileData.Max(x=>x.Length);
for (int i = 0; i < maxCount ; i++)
{
    combined.Add(string.Join(",", fileData.Select(x => x.Length > i ? x[i] : "")));
}

然后您可以使用File.WriteAllLines()将合并的数据写入目标文件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM