1

みなさん、これが私が行っていることです。2つのテキストファイルがあります。うーん、1つのA.txtとB.txtを呼び出すことができます。

A.txtは、多数のフォルダー名を含む構成ファイルであり、フォルダーごとに1つのリストのみが含まれます。

B.txtは、フォルダの名前とサイズを含むディレクトリリストです。しかし、Bには、1つのエントリだけでなく多数のリストが含まれています。

必要なのは、BにAが含まれている場合です。Aを含むBのすべての行を取得し、A | B | B | Bect...として書き出します。

例:

A.txt:
Apple
Orange
Pear XBSj
HEROE

B.txt:
Apple | 3123123
Apple | 3434
Orange | 99999999
Orange | 1234544
Pear | 11
Pear | 12
XBSJ | 43949
XBSJ | 43933

Result.txt:
Apple | 3123123 | 3434
Orange | 99999999 | 1234544
Pear | 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

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 に答える