2010-01-21 2 views
0

Что у меня есть конфигурационный файл с 100 строк, который имеет следующий формат:C# форматированием регулярок проблемы

входной линии: FHF02030304 | C: \ сд \ папа \ QWE \ ре | {203-207}. TXT | 5`

формат: ID|Directory|Text|# txts

формула для дополнительных линий текста (в примере 203) +1, -1.

поэтому в следующем примере 203 +1 -1 = 203 (первый файл) 203 + 2-1 = 204 (2-й файл) мне нужно перевести, что Пример вывода:
FHF02030304 | C : \ сд \ папа \ QWE \ ре | 203.txt
FHF02030305 | C: \ сд \ папа \ QWE \ ре | 204.txt
FHF02030306 | C: \ сд \ папа \ QWE \ ре | 205.txt
FHF02030307 | C: \ сд \ папа \ QWE \ ре | 206.txt
FHF02030308 | C: \ сд \ папа \ QWE \ ре | 207.txt

Так я в основном приходится переводить одна строка файла для дополнительных строк для каждого файла.

Что я пытаюсь сделать, это взять файл конфигурации и превратить его в полный путь к файлу. так что в примере FHF02030304 | C: \ сд \ папа \ QWE \ ре | 203.txt
FHF02030305 | C: \ сд \ папа \ QWE \ ре | 204.txt
FHF02030306 | C: \ сд \ папа \ QWE \ ре | 205.txt
FHF02030307 | C: \ сд \ папа \ QWE \ ре | 206.txt
FHF02030308 | C: \ сд \ папа \ QWE \ ре | 207.txt

другими словами C: \ sd \ dad \ qwe \ re \ 203.txt - полный путь. Причина последнего номера после последнего | так важно, так это то, сколько файлов связано с этим файлом. Итак, если бы было 200, это означало бы, что есть 200 файлов, и мне нужно начинать после первого числа, и перейти от # +199 (и это плюс 199, потому что формула - это номер +1 -1).

+4

Я читал это пару раз, и я не понимаю, что вы подразумеваете под «формулой для разделения текста». Вы приводите примеры, такие как 203 + 1-1 = 203, что здорово, но я не понимаю, о чем вы говорите. Также я не знаю, что вы подразумеваете под «переводить одну строку файла в дополнительные строки». Может быть, пример: XXX - вход, YYY - желаемый вывод. – Cheeso

+0

@Cheeso ive сделал (а) редактировать – 2010-01-21 17:39:01

+0

Я вижу, вы отредактировали вопрос. Так понятней. Но я все еще не понимаю. Сколько дополнительных строк вы хотите? Является ли # txts избыточным с {203-207} в исходной строке? – Cheeso

ответ

0

Этот код в C#

public void Run() 
{ 
    string filename = "MikeD.txt"; 
    using (var tr = new StreamReader(filename)) 
    { 
     string line = null; 
     while ((line= tr.ReadLine()) != null) 
     { 
      System.Console.WriteLine("#orig: {0}",line); 
      var tokens = line.Split('|'); 
      if (tokens.Length == 4) 
      { 
       // find first numeric digit in tokens[0] 
       int n=0; 
       while(tokens[0][n]<'0' || tokens[0][n]>'9') n++; 

       // get the base for the first output argument 
       int b1 = Int32.Parse(tokens[0].Substring(n)); 

       // get the prefix for the first output arg 
       string prefix = tokens[0].Substring(0,n); 

       // find the beginning index in tokens[2] 
       var p1 = tokens[2].Substring(1).Split('-'); 
       int b2 = Int32.Parse(p1[0]); 

       // find the extension in tokens[2] 
       var p2 = tokens[2].Split('.'); 
       string ext = p2[1]; 

       // determine how many lines to output 
       int x = Int32.Parse(tokens[3]); 

       // output the lines 
       for (int i=0; i < x; i++) 
       { 
        System.Console.WriteLine("{0}{1}|{2}|{3}.{4}", 
              prefix, 
              b1+i, 
              tokens[1], 
              b2+i, 
              ext 
              ); 
       } 

      } 
      else 
      { 
       System.Console.WriteLine("-bad input-"); 
      } 
     } 
    } 
} 

Результат:

#orig: FHF02030304|C:\sd\dad\qwe\re|{203-207}.TXT|5 
FHF2030304|C:\sd\dad\qwe\re|203.TXT 
FHF2030305|C:\sd\dad\qwe\re|204.TXT 
FHF2030306|C:\sd\dad\qwe\re|205.TXT 
FHF2030307|C:\sd\dad\qwe\re|206.TXT 
FHF2030308|C:\sd\dad\qwe\re|207.TXT 
+0

Cheeso спасибо, я вижу, где вы собираетесь с ним.Однако он вырезает 00 в моей первой колонке ... так как FHF00023540 превращается в FHF23540 – 2010-01-21 19:22:58

0

Это не имеет никакого отношения к регулярным выражениям. Я предлагаю вам разделить строки на '|', а затем сгенерировать дополнительные строки в вашей программе. Если я правильно понимаю логику вашего текстового поля правильно (ваше объяснение еще не ясно), это будет основной алгоритм:

foreach line: 
    values = line.split('|') 
    text = values[2] 
    number, plus, minus = parse_text(text) 
    end = start = number 
    end = end + plus - minus 
    for (i = start; i != end; i++) 
     print values[0], values[1], i, values[3] 
Смежные вопросы