C# 大文本文件1>使用File.ReadLine的KeyValuePair的GB频率
一般来说,我对C和面向对象编程都是新手。我有一个解析非常大的文本文件的应用程序 我有两本字典: Dictionary parsingDict//键:原始值,值:替换 字典频率//键:计数,值:计数字符串 我正在查找每个键的频率。我能够获得所需的输出,即: 系统1已被MachineA替换5次 System2已被MachineB替换7次 System3已被MachineC替换10次 系统4已更换为机加工19次 以下是我的代码:C# 大文本文件1>使用File.ReadLine的KeyValuePair的GB频率,c#,file.readalllines,C#,File.readalllines,一般来说,我对C和面向对象编程都是新手。我有一个解析非常大的文本文件的应用程序 我有两本字典: Dictionary parsingDict//键:原始值,值:替换 字典频率//键:计数,值:计数字符串 我正在查找每个键的频率。我能够获得所需的输出,即: 系统1已被MachineA替换5次 System2已被MachineB替换7次 System3已被MachineC替换10次 系统4已更换为机加工19次 以下是我的代码: String[] arrayofLine = File.ReadAllL
String[] arrayofLine = File.ReadAllLines(File);
foreach (var replacement in parsingDict.Keys)
{
for (int i = 0; i < arrayofLine.Length; i++)
{
if (arrayofLine[i].Contains(replacement))
{
countr++;
Frequency.Add(countr, Convert.ToString(replacement));
}
}
}
Frequency = Frequency.GroupBy(s => s.Value)
.Select(g => g.First())
.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); //Get only the distinct records.
foreach (var freq in Frequency)
{
sbFreq.AppendLine(string.Format("The text {0} was replaced {2} time(s) with {1} \n",
freq.Value, parsingDict[freq.Value],
arrayofLine.Where(x => x.Contains(freq.Value)).Count()));
}
使用字符串[]arrayofLine=File.ReadAllLinesFile;提高内存利用率
如何使用File.ReadLine实现arrayofLine.Wherex=>x.Containsfreq.Value.Count,因为它对内存友好。您可以非常轻松地一次读取一行 相关代码如下所示:
Dictionary<string,int> lineCount = new Dictionary<string,int>();
string line;
// Read the file and display it line by line.
using(System.IO.StreamReader file =
new System.IO.StreamReader("c:\\test.txt"))
{
while((line = file.ReadLine()) != null)
{
string value = DiscoverFreq(line);
lineCount[value] += 1;
}
}
注意:您还需要考虑存储的其他信息,这一点很重要。将一个大文件中的行追加到一个字符串本质上与一次读取整个文件相同,但需要更多的垃圾收集
注2:我简化了更新计数的部分。您必须检查count条目是否存在并添加它,如果存在,则增加它。或者,您可以在扫描文件之前,使用设置为0的所有频率值初始化行数
如果唯一单词的数量足够多,那么您可能需要使用类似SQLite的小型数据库来存储计数。这使您可以快速查询信息,而不必考虑如何存储和读取您自己编写的自定义文件。每次您从未使用该行时,第二次查询的目的是什么?可能重复的是您读取文件的次数太多,每一次读取一次。使用StreamReader并重写foreach的订单。哎呀。。更新了如何使用文件实现arrayofLine.Wherex=>x.Containsfreq.Value.Count的帖子。ReadLine@Tango编辑以添加频率部分。顺便说一句,它看起来像是出现错误的键和值数据类型。我发现不必做所有的分组工作,您应该让代码尽可能简单。如何使用File.readlinex=>x.Containsfreq.Value.Count实现arrayofLine.Wherex=>x.Containsfreq.Value.Count问题是您试图一次搜索所有行。也许建立一个计数字典,对于每一行处理,你会发现你处理的频率值和增量。之后,您可以使用该字典获取最终计数。使用我用于查找频率的全部代码更新了我的帖子。关于或者,您可以在扫描文件之前,使用设置为0的所有freq.值初始化行计数。。。只有在已知/检测到行值的情况下,这才有效
string line = string.Empty;
Dictionary<string, int> found = new Dictionary<int, string>();
using(System.IO.StreamReader file = new System.IO.StreamReader(@"c:\Path\To\BigFile.txt"))
{
while(!file.EndOfStream)
{
line = file.ReadLine();
// Matches found logic
if (!found.ContainsKey(line)) found.Add(line, 1);
else found[line] = found[line] + 1;
}
}