在C#代码清理中合并2个TSV文件

时间:2016-03-04 14:53:48

标签: c# linq

我提供了2个Excel文件,我将其转换为TSV文件,最后必须提供TSV文件。第一个文件是主文件(strWorksheetPath),必须包含所有行。第二个文件(PrintPath)有附加信息,但主文件中的每一行都没有附加信息。要在C#中执行此操作,我按照this msdn guide执行我必须执行的操作并且工作正常。不幸的是,文件1有23列,文件2有10列,最多可添加33列,共有33个属性。我创建了一些临时类来查看一切是否正常,但在我看来它看起来非常混乱。

有没有办法清理我的代码,让它看起来更整洁可能不需要制作临时类,压缩一些重复的代码,......?

public static void ConvertTSVtoMontDataTable(string strWorksheetPath, string strPrintPath,
        bool closeConnection = true)
    {
        // Check if the main file exist.
        if (!File.Exists(strWorksheetPath)) return;

        // Load both files.
        var mainFile = File.ReadAllLines(strWorksheetPath);
        var extraFile = File.ReadAllLines(strPrintPath);

        // Create 2 lists.
        var mainLines = mainFile.Select(line => new TempMainLine(line)).ToList();
        var extraLines = extraFile.Select(line => new TempExtraLine(line)).ToList();
        var lines = new List<TempLine>();


        // Merge both files.
        var leftOuterJoinQuery =
            from worksheetLine in mainLines
            join printLine in extraLines on string.Concat(worksheetLine.prop6, worksheetLine.prop8) equals
                string.Concat(printLine.prop4, printLine.prop5) into lineGroup
            from line in lineGroup.DefaultIfEmpty()
            select
                new TempLine(worksheetLine.prop0, worksheetLine.prop1, worksheetLine.prop2, worksheetLine.prop3,
                    worksheetLine.prop4, worksheetLine.prop5, worksheetLine.prop6, worksheetLine.prop7,
                    worksheetLine.prop8, worksheetLine.prop9, worksheetLine.prop10, worksheetLine.prop11,
                    worksheetLine.prop12, worksheetLine.prop13, worksheetLine.prop14, worksheetLine.prop15,
                    worksheetLine.prop16, worksheetLine.prop17, worksheetLine.prop18, worksheetLine.prop19,
                    worksheetLine.prop20, worksheetLine.prop21, worksheetLine.prop22, line == null ? "" : line.prop0,
                    line == null ? "" : line.prop1, line == null ? "" : line.prop2, line == null ? "" : line.prop3,
                    line == null ? "" : line.prop4, line == null ? "" : line.prop5, line == null ? "" : line.prop6,
                    line == null ? "" : line.prop7, line == null ? "" : line.prop8, line == null ? "" : line.prop9);

        foreach (var tempLine in leftOuterJoinQuery)
        {
            lines.Add(tempLine);
        }

        // Write output to new temp file (TESTING)
        using (
            var file =
                new StreamWriter(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                    "output.txt")))
        {
            foreach (var item in lines)
            {
                file.WriteLine(item.prop0 + (char)9 + item.prop1 + (char)9 + item.prop2 + (char)9 + item.prop3 +
                               (char)9 + item.prop4 + (char)9 + item.prop5 + (char)9 + item.prop6 + (char)9 +
                               item.prop7 + (char)9 + item.prop8 + (char)9 + item.prop9 + (char)9 + item.prop10 +
                               (char)9 + item.prop11 + (char)9 + item.prop12 + (char)9 + item.prop13 + (char)9 +
                               item.prop14 + (char)9 + item.prop15 + (char)9 + item.prop16 + (char)9 +
                               item.prop17 + (char)9 + item.prop18 + (char)9 + item.prop19 + (char)9 +
                               item.prop20 + (char)9 + item.prop21 + (char)9 + item.prop22 + (char)9 +
                               item.prop23 + (char)9 + item.prop24 + (char)9 + item.prop25 + (char)9 +
                               item.prop26 + (char)9 + item.prop27 + (char)9 + item.prop28 + (char)9 +
                               item.prop29 + (char)9 + item.prop30 + (char)9 + item.prop31 + (char)9 +
                               item.prop32);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

我更多地想到了这一点,无论你的Temp *类是什么样的,下面的内容都会有用,假设(基于你提供的代码),你输出的是每一列文件按照它们进入的顺序排列。如果您需要排除字段,更改顺序等,则需要对以下内容进行一些更改或完全不同的解决方案。

它基本上只是读取这两个文件,加入Split()结果然后组合这两行。我没有看到处理null printFile行的LOJ逻辑有一点,但是如果你需要额外的标签,你可以用line ?? ""

之类的东西替换line ?? new String('\t', 10)

请注意,这可能不是解决此问题的最有效方法,如果您的文件很大,您肯定希望对此进行优化。

// Merge both files.
var lines =
    from worksheetLine in mainFile
    join printLine in extraFile on string.Concat(worksheetLine.Split('\t')[6], worksheetLine.Split('\t')[8]) equals
    string.Concat(printLine.Split('\t')[4], printLine.Split('\t')[5]) into lineGroup
    from line in lineGroup.DefaultIfEmpty()
    select string.Concat(worksheetLine, line ?? "");

// Write output to new temp file (TESTING)
using (
    var file =
        new StreamWriter(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
            "output.txt")))
{
    foreach (var item in lines)
    {
        file.WriteLine(item);
    }
}