如何将不同的文本文件放在一起等于第一行 - C#

时间:2014-05-23 20:28:32

标签: c#

请检查一下: 文本文件具有以下结构:

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

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

2 个答案:

答案 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)

方法应该是

  1. 将文件中的数据加载到内存(集合/词典/等)
  2. 通过在同一组(code1; code2)中添加代码数量,将数据合并为一组
  3. 将合并数据存储回文件
  4. 为了达到同样的目的,我创建了一个班级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文件。