2016-03-08 3 views
0

У меня есть текстовый файл со списком номеров деталей. Мне нужно добавить первый номер части каждой строки с системным номером. данных выглядит следующим образом:Вставить текст в фиксированное положение в каждой строке текстового файла

94-CP1019011;967;94-EA1015590;1; 
94-CP1019011;980;94-EA1020966;1; 
94-CP1019011;669;94-EA1019084;1; 
94-CP1019011;655;94-EA1015807;1; 
94-CP1019011;326;94-KT1016113;1; 
94-CP1019013;383;94-KT1015547;1; 
94-CP1019013;608;94-MA1013256;1; 
94-CP1019013;924;94-MA1019863;1; 
94-CP1019013;384;94-MA1014969;1; 

Первый номер детали всегда 12 голец, поэтому я попытался это:

TextReader reader = new StreamReader("C:/Temp/BOM.txt"); 
TextWriter writer = new StreamWriter("C:/Temp/xBOM.txt"); 
for (;;) 
{ 
    string s = reader.ReadLine(); 
    if (s == null) 
     break; 

    s = s.Insert(12, "-814590"); 
    writer.WriteLine(s); 
} 

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

+0

Куда вы закрываете или убираете писателя? –

+0

Петля в порядке - это стандартная петля и полтора. Проблема находится вне кода, который вы опубликовали. Я подозреваю, что вы не закрываете файл, прежде чем пытаться его использовать. Кроме того, единственный способ изменить исходный файл таким образом - создать новый, как вы делаете, а затем удалить старый и переименовать новый. Если вы не сможете прочитать все это в памяти - см. Ответ Хари Прасад. –

ответ

1

Для решения этой проблемы необходимо внести незначительные изменения.

Вы можете позвонить по телефону continue вместо break. Modify

if (s == null) break;

в

if (s == null) continue; 

Заключительный фрагмент кода должен быть ...

while (reader.Peek() >= 0) 
{ 
    string s = reader.ReadLine(); 
    if(string.IsNullOrEmpty(s)) continue; 

    s = s.Insert(0, "-814590"); 
    writer.WriteLine(s); 
} 

Если вы заинтересованы, мы также можем сделать это с помощью нескольких Linq заявлений.

var formattedLines = File.ReadAllLines("C:/Temp/BOM.txt") 
       .Where(line => !string.IsNullOrEmpty(line)) 
       .Select(s => s.Insert(12, "-814590")).ToArray(); 

File.WriteAllLines(@"C:/Temp/xBOM.txt", formattedLines); 
+0

см. \t @MatthewWatson comment - это будет цикл навсегда :-) – profesor79

+0

О, да, обновит его. Спасибо @ profesor79 –

+0

@ profesor79 Обновлен мой ответ, спасибо, что указали его. –

1

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

TextReader reader = new StreamReader("C:/Temp/BOM.txt"); 
TextWriter writer = new StreamWriter("C:/Temp/xBOM.txt"); 

while (!string.IsNullOrEmpty(reader.ReadLine())) 
{ 
    string s = reader.ReadLine(); 

    s = s.Insert(12, "-814590"); 
    writer.WriteLine(s); 
} 

reader.Dispose(); 
writer.Close(); 
writer.Dispose(); 
+0

Это будет выполняться навсегда, когда будет достигнут конец файла, и 'reader.ReadLine()' начинает возвращать 'null' каждый раз, когда он вызывается. –

+0

@MatthewWatson - true - исправит это – profesor79

+0

@MatthewWatson исправлено. – profesor79

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