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”,因为它读取整行并且无法找到它。但我仍然相信我的输出文件不会包含我需要的内容。
答案 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
答案 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());