1

Я ищу несколько советов о том, как объединить несколько текстовых файлов на основе их заголовков.Слияние текстовых файлов на основе заголовков.

Так сказать, у меня есть следующие 3 текстовых файла со следующими заголовками. Как вы можете видеть, некоторые элементы повторяются, а некоторые являются уникальными для текстового файла. Текстовые файлы содержат тысячи строк под каждым заголовком, содержащим различные типы данных.

Текстовый файл 1:

element1 | ELEMENT2 | element4 | Element5 | 00000001 | 00000002 | 00000004 | 00000005 |

Text File 2:

ELEMENT2 | element3 | element4 | Element5 | 00000002 | 00000003 | 00000004 | 00000005 |

Текстовый файл 3:

element1 | element3 | element4 | Element6 | 00000001 | 00000003 | 00000004 | 00000006 |

Окончательный выход Текстовый файл будет будет выглядеть примерно так:

element1 | ELEMENT2 | element4 | Element5 | element3 | Element6 | 00000001 | 00000002 | 00000004 | 00000005 | 00000003 | ________ | ________ | 00000002 | 00000004 | 00000005 | ________ | ________ | 00000001 | ________ | 00000004 | ________ | 00000003 | 00000006 |

Как вы можете видеть, выходной текстовый файл будет захватывать каждый заголовок из исходных 3 текстовых файлов. Затем он будет хранить каждое поле данных под соответствующим заголовком. Если элемент не доступен в определенном текстовом файле, поле остается пустым.

+0

, что вы пробовали до сих пор? У вас есть код, который работает неправильно? – BrokenGlass

+0

У меня есть приложение, которое разбивает некоторые элементы, похожие на то, как у меня есть это выше, используя .split и словарь. Однако я не уверен, как я могу объединить текстовые файлы. – erick

ответ

1

Вы должны показать нам, какой код у вас уже есть, а затем спросить, как подойти к той части, которую вы не можете решить.

Предлагаю вам сохранить список заголовков и список или словарь строк. Таким образом, вы можете проверить, существует ли заголовок.

Например:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 

namespace TestElements 
{ 
    public class Elements 
    { 
     public static string[] ROW_SEPARATOR = { " " }; 
     public static string[] ELEMENT_SEPARATOR = { "|" }; 

     private int _nextRowId; 
     public List<string> ColumnHeaders; 
     public Dictionary<int, Dictionary<string, string>> Rows; 

     public Elements() 
     { 
      this._nextRowId = 0; 
      this.ColumnHeaders = new List<string>(); 
      this.Rows = new Dictionary<int, Dictionary<string, string>>(); 
     } 

     public void AddFromFile(string path) 
     { 
      // Read all the file, and split in lines 
      string[] lines = File.ReadAllText(path).Split(ROW_SEPARATOR, StringSplitOptions.None); 

      // Get the headers 
      List<string> headers = lines[0].Split(ELEMENT_SEPARATOR, StringSplitOptions.None).ToList(); 

      // Add headers that are new 
      foreach (string header in headers) 
      { 
       if (!this.ColumnHeaders.Contains(header)) 
       { 
        this.ColumnHeaders.Add(header); 
       } 
      } 

      // Parse every line 
      for (int i = 1; i < lines.Length; i++) 
      { 
       // Split a line into elements 
       List<string> elements = lines[i].Split(ELEMENT_SEPARATOR, StringSplitOptions.None).ToList(); 

       // Build a row of elements 
       Dictionary<string, string> row = new Dictionary<string,string>(); 
       for (int j = 0; j < headers.Count; j++) 
       { 
        row.Add(headers[j], elements[j]); 
       } 

       // Add the row to our store 
       this.AddRow(row); 
      } 
     } 

     private void AddRow(Dictionary<string, string> rowdata) 
     { 
      this.Rows.Add(this._nextRowId, rowdata); 
      this._nextRowId++; 
     } 
    } 
} 

Заботьтесь Я не проверять на наличие ошибок в этом примере.

Затем вы можете построить выходной текст так, как хотите.

Если у вас есть более конкретный вопрос, или это не помогает, просто спросите.


EDIT: Вот пример использования

 // Create a few files to use in a test 
     string TextFile1 = 
      "Element1|Element2|Element4|Element5| " + 
      "00000001|00000002|00000004|00000005| " + 
      "00000011|00000012|00000014|00000015| " + 
      "00000021|00000022|00000024|00000025| " + 
      "00000031|00000032|00000034|00000035|"; 
     string TextFile2 = 
      "Element2|Element3|Element4|Element5| " + 
      "00000002|00000003|00000004|00000005| " + 
      "00000012|00000013|00000014|00000015| " + 
      "00000022|00000023|00000024|00000025|"; 
     string TextFile3 = 
      "Element1|Element3|Element4|Element6| " + 
      "00000001|00000003|00000004|00000006| " + 
      "00000011|00000013|00000014|00000016| " + 
      "00000021|00000023|00000024|00000026| " + 
      "00000031|00000033|00000034|00000036| " + 
      "00000041|00000042|00000044|00000045|"; 

     File.WriteAllText("File1.txt", TextFile1); 
     File.WriteAllText("File2.txt", TextFile2); 
     File.WriteAllText("File3.txt", TextFile3); 

     // Read the files into our class 
     Elements elements = new Elements(); 
     elements.AddFromFile("File1.txt"); 
     elements.AddFromFile("File2.txt"); 
     elements.AddFromFile("File3.txt"); 

     // Build the result 
     StringBuilder sb = new StringBuilder(); 

     // First build headers 
     foreach (string header in elements.ColumnHeaders) 
     { 
      sb.Append(header); 
      sb.Append("|"); 
     } 
     sb.Append(Environment.NewLine); 

     // Next add every row 
     foreach (Dictionary<string, string> row in elements.Rows.Values) 
     { 
      foreach (string header in elements.ColumnHeaders) 
      { 
       if (row.ContainsKey(header)) 
       { 
        sb.Append(row[header]); 
       } 
       else 
       { 
        sb.Append("________"); 
       } 
       sb.Append("|"); 
      } 
      sb.Append(Environment.NewLine); 
     } 

     // Finally save the result into a file 
     File.WriteAllText("Result.txt", sb.ToString()); 

И результат выглядит следующим образом:

Element1|Element2|Element4|Element5|Element3|Element6| 
00000001|00000002|00000004|00000005|________|________| 
00000011|00000012|00000014|00000015|________|________| 
00000021|00000022|00000024|00000025|________|________| 
00000031|00000032|00000034|00000035|________|________| 
________|00000002|00000004|00000005|00000003|________| 
________|00000012|00000014|00000015|00000013|________| 
________|00000022|00000024|00000025|00000023|________| 
00000001|________|00000004|________|00000003|00000006| 
00000011|________|00000014|________|00000013|00000016| 
00000021|________|00000024|________|00000023|00000026| 
00000031|________|00000034|________|00000033|00000036| 
00000041|________|00000044|________|00000042|00000045| 
+0

Blas - Спасибо за ваш ответ! Я пытался реализовать ваш код, и он был очень полезен до сих пор. Вопрос: Как я могу назвать конкретный заголовок из словаря rowdata? Поскольку он выглядит как _nextRowId, это просто количество строк в текстовом файле, а затем rowdata - все заголовки в текстовом файле, прикрепленном к этому счету строк. Другими словами, как я могу получить заголовок номер 5 из строки 3? – erick

+0

@erick Это был просто предложенный подход, прежде чем вы добавили комментарий о том, как вы пытаетесь. Я добавил пример использования. Если вы хотите руководство по своему собственному подходу, отредактируйте свой вопрос и добавьте свой код. –

+0

Blas - Это было чрезвычайно полезно. Спасибо за ваши усилия и время. – erick

Смежные вопросы