C#组合线

时间:2010-04-07 14:16:43

标签: c# text-processing

嘿大家,这就是我的目标。我有两个文本文件。嗯我们可以调用一个A.txt和B.txt。

A.txt是一个配置文件,其中包含一堆文件夹名称,每个文件夹只有1个列表。

B.txt是一个包含文件夹名称和大小的目录列表。但是B包含一堆列表而不仅仅是一个条目。

我需要的是,如果B,包含A.取B中包含A的所有行并将其写为A | B | B | B等....

所以例子:

A.TXT:
苹果
橙色
梨 XBSj
HEROE

B.txt:
苹果| 3123123
苹果| 3434
橙色| 99999999
橙色| 1234544
梨| 11
梨| 12
XBSJ | 43949
XBSJ | 43933

的Result.txt:
苹果| 3123123 | 3434
橙色| 99999999 | 1234544
梨| 11个| 12个
XBSJ | 43949 | 43933

这就是我所拥有的,但它并没有真正做我需要的。

string[] combineconfig = File.ReadAllLines(@"C:\a.txt");
        foreach (string ccline in combineconfig)
        {
            string[] readlines = File.ReadAllLines(@"C:\b.txt");
            if (readlines.Contains(ccline))
            {
                foreach (string rdlines in readlines)
                {
                    string[] pslines = rdlines.Split('|');
                    File.AppendAllText(@"C:\result.txt", ccline + '|' + pslines[0]);
                }
            }

我知道它不会找到第一个“if”,因为它读取整行并且无法找到它。但我仍然相信我的输出文件不会包含我需要的内容。

4 个答案:

答案 0 :(得分:5)

假设您使用的是.NET 3.5(因此可以使用LINQ),请尝试以下操作:

string[] configLines = File.ReadAllLines("a.txt");
var dataLines = from line in File.ReadAllLines("b.txt")
                let split = line.Split('|')
                select new { Key = split[0], Value = split[1] };
var lookup = dataLines.ToLookup(x => x.Key, x => x.Value);

using (TextWriter writer = File.CreateText("result.txt"))
{
    foreach (string key in configLines)
    {
        string[] values = lookup[key].ToArray();
        if (values.Length > 0)
        {
            writer.WriteLine("{0}|{1}", key, string.Join("|", values));
        }
    }
}

答案 1 :(得分:5)

var a = new HashSet<string>(File.ReadAllLines(@"a.txt")
                                .SelectMany(line => line.Split(' ')),
                            StringComparer.CurrentCultureIgnoreCase);

var c = File.ReadAllLines(@"b.txt")
            .Select(line => line.Split('|'))
            .GroupBy(item => item[0], item => item[1])
            .Where(group => a.Contains(group.Key))
            .Select(group => group.Key + "|" + string.Join("|", group.ToArray()))
            .ToArray();

File.WriteAllLines("result.txt", c);

输出:

Apple|3123123|3434
Orange|99999999|1234544
Pear|11|12
XBSJ|43949|43933

答案 2 :(得分:1)

这应该有效:

using System;
using System.Linq;
using System.IO;
using System.Globalization;

namespace SO2593168
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = File.ReadAllLines("A.txt");
            var b =
                (from line in File.ReadAllLines("B.txt")
                 let parts = line.Split('|')
                 select new { key = parts[0], value = parts[1] });

            var comparer = StringComparer.Create(CultureInfo.InvariantCulture, true);
            var result =
                from key in a
                from keyvalue in b
                where comparer.Compare(keyvalue.key, key) == 0
                group keyvalue.value by keyvalue.key into g
                select new { g.Key, values = String.Join("|", g.ToArray()) };

            foreach (var entry in result)
                Console.Out.WriteLine(entry.Key + "|" + entry.values);
        }
    }
}

这会产生:

Apple|3123123|3434
Orange|99999999|1234544
Pear|11|12
XBSJ|43949|43933

Code here

答案 3 :(得分:1)

简短的一句:

var a = File.ReadAllLines("A.txt");
var b = File.ReadAllLines("B.txt");

var query =
    from bline in b
    let parts = bline.Split('|')
    group parts[1] by parts[0] into bg
    join aline in a on bg.Key equals aline
    select aline + "|" + string.Join("|", bg.ToArray());

File.WriteAllLines("result.txt", query.ToArray());