C # - Concat до конца, если совпадает с передней части файла - PullRequest
1 голос
/ 09 июля 2011

У меня есть файл, который я обрезал, чтобы сохранить в нем только некоторые данные. Этот файл - файл, который я хотел бы добавить в конец второго файла. Вот как выглядит первый файл:

147221
147486
147514-1
147502
147503
...

Я бы хотел добавить его в конец файла, который выглядит следующим образом:

       some text    ... more text

text    text: Description                 

Ln      PPN PD  Qty Units   Comment MNAME   MfMCODE
                                 some comment       
1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER     
2   EC0303  FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS    2.00    EA  FB2 FB4 MURATA  BLM18RK102SN1
3   EC0304  FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS   2.00    EA  FB1 FB5 MURATA  BLM21PG221SN1
4   EC7727  IC: LTC2851 RS422 XCVR SO8 +RHS 1.00    EA  U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF
                    LINEAR TECHNOLOGIES LTC2851IS8#PBF
                    MAXIM   MAX3077EASA+
                    MAXIM   MAX3077EESA+
                DNP  C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20      
                R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61      
                J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54      
                TP56-96     

5   EC5071  CONN: HEADER RA 0.1x10 0.025 SQ +RHS    1.00    EQ  J2  SAMTEC  TSW-110-08-S-S-RA
...

Путем сопоставления, чтобы увидеть, начинается ли вторая строка файла с 1,2,3,4,5 и т. Д., А затем добавление строк из первого файла в том же порядке.

То, что я имею в виду, чтобы это выглядело, было бы примерно так:

       some text    ... more text

text    text: Description                 

Ln      PPN PD  Qty Units   Comment MNAME   MfMCODE
                                 some comment       
1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER  147221

2   EC0303  FERRITE BEAD: 200MA 1000Z0.8 SM0603 +RHS    2.00    EA  FB2 FB4 MURATA  BLM18RK102SN1    147486
3   EC0304  FERRITE BEAD: 2000MA 220Z0.05 SM0805 +RHS   2.00    EA  FB1 FB5 MURATA  BLM21PG221SN1    147514-1
4   EC7727  IC: LTC2851 RS422 XCVR SO8 +RHS 1.00    EA  U10 LINEAR TECHNOLOGIES LTC2851CS8#PBF       147502
                    LINEAR TECHNOLOGIES LTC2851IS8#PBF
                    MAXIM   MAX3077EASA+
                    MAXIM   MAX3077EESA+
                DNP  C20 C24 C25 C27 C44 C60 C62 J1 J5 J6 J7 J8 J11 R2 R20      
                R29 R33 R53 R54 R89 R91 R94 R96 R107 R108 R109 C63 R61      
                J12 J13 U7 TP1-20 TP22-28 TP34-36 TP38-39 TP41 TP43-54      
                TP56-96     

5   EC5071  CONN: HEADER RA 0.1x10 0.025 SQ +RHS    1.00    EQ  J2  SAMTEC  TSW-110-08-S-S-RA        147503
.... 

МЫСЛИ

  • Сейчас я думаю, что лучший способ сделать это - обрезать исходный файл (что я уже сделал), а затем перебрать второй файл, ища строки, начинающиеся с цифры. (Я бы подумал сделать это с помощью выражения регулярного выражения: ... @ "^ [\ d] + \ s +" ...). Однако, используя это регулярное выражение, я бы взял только число в строке, а не всю строку? Но если бы мне удалось захватить всю строку (я не уверен, как это сделать), если эта строка была найдена, я бы поместил ее в строку, а затем добавил первую строку предыдущего файла в конец этой строки с помощью разделитель "\ t".

В значительной степени:

  • Обрезать первый файл до необходимых чисел, необходимых для преобразования в конец 2-го файла (ВЫПОЛНЕНО)
  • Схватить каждую строку во втором файле (один за другим?)
    • Проверьте, начинается ли строка с цифры (используя регулярное выражение?)
      • Если это так, добавьте 1-ю строку в 1-м файле к концу матча во 2-м файле (сделайте это для всех совпадений. 2-я строка со 2-м совпадением, 3-я строка с 3-м совпадением и т. Д.) И сохраните это как новая строка. (проблема в том, что должна быть целая куча строк ... а я не знаком со списками ..)
  • Теперь вернитесь к каждой строке 2-го файла и сравните новую строку (с окончанием первого файла) с каждой строкой 2-го файла. Если есть совпадение, замените эту строку строкой в ​​строке.
  • Вывести его в форматированное текстовое поле / файл .txt.

ВОПРОС

  • Как мне найти строку, которая начинается с 1,2,3,4,5 и т. Д. Во втором файле, а затем захватить первый файл построчно и добавить первую строку в первую строку. В этом случае добавление 147221 к концу всей строки, начинающейся с 1 (147486 к концу строки, начинающейся с 2, и т. Д.)?
  • Кто-нибудь знает более простой способ сделать это?

Ответы [ 4 ]

1 голос
/ 09 июля 2011

Предполагая, что интересующие вас строки всегда будут начинаться с некоторого числа без начальных пробелов, я просто использовал бы регулярное выражение, чтобы убедиться, что строка - это то, что вы ищете (или даже просто проверкаесли первый символ строки представляет собой цифру с использованием Char.IsDigit()), выполните любую обработку после того, как вы ее нашли.

using (var dataReader = File.OpenText(@"path\to\data\file"))
using (var labelReader = File.OpenText(@"path\to\label\file"))
using (var writer = File.CreateText(@"path\to\output\file"))
{
    string line;
    while ((line = dataReader.ReadLine()) != null)
    {
        if (Regex.IsMatch(line, @"^\d+"))
        {   // found the line (append label)
            writer.WriteLine(line + " " + labelReader.ReadLine());
        }
        else
        {   // not the line (pass through)
            writer.WriteLine(line);
        }
    }
}
1 голос
/ 09 июля 2011

Это будет читать из двух входных файлов и записывать в третий.Что касается шаблона регулярных выражений, это будет работать, если строка начинается с любого положительного целого числа (не включая ноль), за которым сразу следует символ пробела (например, строка типа «10 нечислового текста» будет совпадать).

using (StreamReader sr1 = new StreamReader(@"C:\Temp\Content.txt"))
using (StreamReader sr2 = new StreamReader(@"C:\Temp\Numbers.txt"))
using (StreamWriter sw = new StreamWriter(@"C:\Temp\Combined.txt"))
{
    string curLine;
    while ((curLine = sr1.ReadLine()) != null)
    {
        if (Regex.IsMatch(curLine, "^[1-9][0-9]*\s"))
        {
            sw.WriteLine(curLine + "    " + sr2.ReadLine());
        }
        else
        {
            sw.WriteLine(curLine);
        }
    }
}
0 голосов
/ 09 июля 2011

Вывод прост, об этом мы можем побеспокоиться позже.В качестве общего подхода я бы загрузил ваши первые номера файлов в массив (вы можете создать какой-то список или вектор, если хотите, но я не думаю, что это необходимо).Имейте счетчик, когда вы анализируете ваш второй файл, который начинается с 0. Когда вы найдете строку, в которую хотите вывести данные, используйте счетчик в качестве индекса для вашего массива строк, чтобы получить следующую строку в порядке.После записи числа увеличьте свой счетчик.Записать его обратно в файл можно в процессе итерации.Что-то вроде этого (не проверено !!!, это просто, чтобы показать идею.) Должно работать:

StringBuilder newFile = new StringBuilder();
string[] file = File.ReadAllLines(@"file2path");

foreach (string line in file)
{
    if (!regex evaluation here!)
    {
        //append your number and increment counter here

        string temp = line.Replace(oldString, appendedString);

        newFile.Append(temp + "\r\n");

        continue;

    }

    newFile.Append(line + "\r\n");

}

File.WriteAllText(@""file2path", newFile.ToString());
0 голосов
/ 09 июля 2011

Не уверен насчет регулярных выражений, но вы можете использовать функции sting, чтобы сделать это с помощью оператора if-else, например (может не быть полным, но работает)

string str = "1   EC5547  PCB:  SB5500 LCD DISPLAY  CTRL +RHS 1.00    EA  REV 07 OR LATER";
        string str1 = "147221";

        if (str.StartsWith("1"))
        {
            str += str1; 
        }
...