请检查一下: 文本文件具有以下结构:
Text1.txt
000032;120128056
004 00003000
009 00256800
第一行是参数。 其他的是项目(从字符1到20)及其数量(最后8位数字)。
我有一个代码,将目录中的所有文本文件放在一个最终的文本文件中,其中包含来自其他文件的所有信息,保留'相等的代码并添加数量。
string InventX = @"C:\Test";
if (!Directory.Exists(Test))
{
Directory.CreateDirectory(Test);
}
Dictionary<string, int> valores = new Dictionary<string, int>();
string diretorio = FormSelecionaPasta.Confirma;
String[] listaDeArquivos = Directory.GetFiles(diretorio);
if (listaDeArquivos.Length > 0)
{
string caminhoArquivoDestino = @"C:\Test\Test.txt";
FileStream arquivoDestino = File.Open(caminhoArquivoDestino, FileMode.OpenOrCreate);
arquivoDestino.Close();
foreach (String caminhoArquivo in listaDeArquivos)
{
//Lendo o arquivo atual
foreach (var linhaArquivoAtual in File.ReadAllLines(caminhoArquivo))
{
string Codigo = linhaArquivoAtual.Substring(0, linhaArquivoAtual.Length - 8);
string Quantidade = linhaArquivoAtual.Substring(linhaArquivoAtual.Length - 8, 8);
//Verifica se o Codigo existe no dicionário
if (valores.ContainsKey(Codigo))
//Se existir o Codigo no dicionário, soma a quantidade
valores[Codigo] = valores[Codigo] + Convert.ToInt32(Quantidade);
else
//Se nao existir o Codigo no dicionario, adiciona
valores.Add(Codigo, Convert.ToInt32(Quantidade));
}
}
File.WriteAllLines(caminhoArquivoDestino, valores.Select(thales => thales.Key + thales.Value.ToString("00000000")).ToArray());
MessageBox.Show("Success!");
}
else
{
MessageBox.Show("Error!");
}
但是现在,我想通过使用相同的第一行对文件进行分组来分离这些文件。
我会尝试举例。我有这3个文件:
Text1.txt
000032;120128056
004 00003000
009 00256800
Text2.txt
000032;120128056
004 00003000
009 00256800
Text3.txt
000035;120128056
004 00003000
009 00256800
我想获得这些最终文件:
000032120128056.txt
004 00006000
009 00513600
000035120128056
004 00003000
009 00256800
知道了吗?我真的不知道该怎么做。
答案 0 :(得分:0)
一个选项是对每个文件进行第一次快速调用,只读取第一行并创建某种字典,如:
Dictionary<string, List<Stream>> Files;
foreach(var fileName in textFileNames)
{
var fileStream = // open stream.
var firstLine = // read first line
if (Files.ContainsKey(firstLine))
Files[firstLine].Add(fileStream);
else
Files.Add(firstLine, fileStream);
}
之后,您可以使用字典中的密钥集合或直接使用for-each(更好的性能)来重新解析文件。
foreach(var keyPair in Files)
{
var outputFileName = "C:\\Temp\\" + keyPair.Key + ".txt";
foreach(var stream in keyPair.Value)
{
// write (append) to your file.
// close your stream.
}
}
答案 1 :(得分:0)
方法应该是
为了达到同样的目的,我创建了一个班级TextFileInfo
。
注意: 我创建了这个类而不是Dictionary<string, Dictionary<string, int>>
(其中内部Dictionary
存储了商品代码及其数量,而外Dictionary
存储文件代码{code1;code2
}及其项目字典),因为多个文件可以包含相同的code1和code2集(如示例文本文件text1和text2)
有效的代码如下:
<强> 1。将文件中的数据加载到内存(集合/字典/等)
private static List<TextFileInfo> LoadFiles()
{
string[] files = System.IO.Directory.GetFiles(Path.GetDirectoryName(Application.ExecutablePath), "*.txt");
//The inner dictionary contains item code and their quantity. Outer dictionary store the code and their items details
//Dictionary<string, Dictionary<string, int>> allRecords = new Dictionary<string, Dictionary<string, int>>();
List<TextFileInfo> allTextFileInfo = new List<TextFileInfo>();
foreach (string file in files)
{
string[] lines = File.ReadAllLines(file);
TextFileInfo ti = new TextFileInfo();
string codeLine = lines[0];
string[] codeParts = codeLine.Split(';');
ti.code1 = codeParts[0];
ti.code2 = codeParts[1];
for (int i = 1; i < lines.Length; i++)
{
string[] codeAndAmount = lines[i].Split('\t'); //assuming tab as the separator.
string code = codeAndAmount[0];
int quantity = 0;
if (int.TryParse(codeAndAmount[1], out quantity))
{
if (ti.itemInfo.ContainsKey(code))
ti.itemInfo[code] += quantity;
else
ti.itemInfo.Add(code, quantity);
}
}
allTextFileInfo.Add(ti);
}
return allTextFileInfo;
}
<强> 2。通过在同一组(code1; code2)中添加代码数量,将数据合并为一组
private static Dictionary<string, Dictionary<string, int>> ConsolidateRecords(List<TextFileInfo> allTextFileInfo)
{
Dictionary<string, Dictionary<string, int>> consolidatedInfo = new Dictionary<string, Dictionary<string, int>>();
foreach (TextFileInfo ti in allTextFileInfo)
{
string key = ti.code1 + ti.code2;
Dictionary<string, int> allItems = null;
if (!consolidatedInfo.ContainsKey(key))
consolidatedInfo.Add(key, new Dictionary<string, int>());
allItems = consolidatedInfo[key];
foreach (string code in ti.itemInfo.Keys)
{
int quantity = ti.itemInfo[code];
if (allItems.ContainsKey(code))
allItems[code] += quantity;
else
allItems.Add(code, quantity);
}
}
return consolidatedInfo;
}
第3。将合并数据存储回文件
private static void SaveToFiles(Dictionary<string, Dictionary<string, int>> consolidatedData)
{
foreach (string key in consolidatedData.Keys)
{
string filename = key + ".log";
Dictionary<string, int> items = consolidatedData[key];
foreach (string code in items.Keys)
{
int quantity = items[code];
File.AppendAllText(filename, code + "\t" + quantity.ToString("D8") + Environment.NewLine);
}
}
}
我得到的输出文件(使用输入文件)是:
000032120128056.log
004 00006000
009 00513600
000035120128056.log
004 00003000
009 00256800
*注意:我已将输出文件的扩展名替换为.log
,因为在阅读文件时,我正在阅读所有.txt
文件。