1

大家好,这就是我正在做的事情。我有两个文本文件。嗯,让我们调用一个 A.txt 和 B.txt。

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

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

结果.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]);
                }
            }

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

4

4 回答 4

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));
        }
    }
}
于 2010-04-07T14:22:03.960 回答
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);

输出:

苹果|3123123|3434
橙色|99999999|1234544
梨|11|12
XBSJ|43949|43933
于 2010-04-07T14:24:08.477 回答
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

代码在这里

于 2010-04-07T14:31:29.247 回答
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());
于 2010-04-07T14:43:10.133 回答