如何将不同的文本文件用等号第一行放在一起- c#

本文关键字:一行 在一起 文本 文件 | 更新日期: 2023-09-27 18:04:55

请检查一下:一个文本文件有这样的结构:

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!");
}

但是现在,我想通过将具有相同第一行的文件分组来分离这些文件。

我将试着举例说明。我有这三个文件:

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

明白了吗?我真不知道该怎么做。

如何将不同的文本文件用等号第一行放在一起- c#

一种选择是对每个文件进行第一次快速调用,只读取第一行并创建某种字典,如:

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. 将文件中的数据加载到内存中(一个集合/字典/等)
  2. 通过为同一集合(code1;code2)中的代码添加数量将数据合并为一组
  3. 将合并后的数据存储回文件

为了达到同样的目的,我创建了一个类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文件。