2015-11-12 2 views
2

Kinda new to C#Изменение строк в txt-файле

Есть ли способ изменить текст внутри txt-файла с помощью C#?

Я хочу, чтобы открыть текстовый файл, содержащий:

8881 
8882 
8883 
8884 
8885 

Поместите их в массив, изменить строки в этом:

'8881', 
'8882', 
'8883', 
'8884', 
'8885', 

А потом выписывать новые текстовые файлы с измененным линий.

string[] lines = System.IO.File.ReadAllLines(@"C:\Users\Public\TestFolder\WriteLines2.txt"); 

//Foreach that lists all lines 
System.Console.WriteLine("WriteLines2.txt contains following lines = "); 
foreach (string line in lines) 
{   
    Console.WriteLine(line); 
} 

Как я могу перейти к возможности изменения каждой строки и записать их в новый txt?

+0

вам нужно перебирать содержимое файлов, а также изменять их. –

+0

'changedLine =" '"+ line +"', "' будет преобразовывать '8881' в' '8881', ' –

+0

Вы делаете это: Откройте, прочитайте все в массив, закройте. Затем работайте с массивом. С большими файлами он может быть очень медленным и даже сбой из-за недостаточной памяти. Вместо этого открывайте, читайте по очереди, вытирая между ними и закрывая. Вы можете протестировать несколько миллионов строк. –

ответ

1

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

String path = @"C:\Users\Public\TestFolder\WriteLines2.txt"; 
String[] lines = System.IO.File.ReadAllLines(path); 
//I'm using System.Linq to change the lines. I'm adding a "'" before and after the original token. 
String[] changedLines = lines.Select(x => string.Format("'{0}',", x)).ToArray(); 

// I'm saving the changes to the file. 
System.IO.File.WriteAllLines(path, changedLines); 

Вы также можете сделать это без System.Linq

string[] path = @"C:\Users\Public\TestFolder\WriteLines2.txt"; 
string[] lines = System.IO.File.ReadAllLines(path); 

// change every line 
for (int index = 0; index < lines.Length; ++index) 
{   
    lines[index] = string.Format("'{0}',", lines[index]); 
} 

System.IO.File.WriteAllLines(path, lines); 
+2

'' {0} ''должно быть'' {0} ', ' –

+0

@ SonerGönül Исправлено, спасибо :) – m1o2

+1

Спасибо! Помогает мне много! –

7

Вы можете использовать следующий простой запрос LINQ и File.WriteAllLines:

var newLines = from line in System.IO.File.ReadAllLines(filePath) 
       select String.Format("'{0}',", line); 
System.IO.File.WriteAllLines(filePath, newLines); 
+0

Работал как шарм. Я полностью пропустил часть String.Format. Спасибо! –

0
var linesModified = lines.Select (l => string.Format(@"'{0}',",l)); 
File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines2_Out.txt", linesModified); 

EDIT: Efficient версии с помощью потоковой передачи, а чем загрузка (возможно, большого файла) всего файла в память:

void Main() 
{ 
    string inFileName = @"C:\Users\Public\TestFolder\WriteLines2.txt"; 
    string outFileName = @"C:\Users\Public\TestFolder\WriteLines2_Out.txt"; 

    using(var r = File.OpenText(inFileName)) 
    using(var w = File.CreateText(outFileName)) 
    { 
    string line; 
    while ((line = r.ReadLine()) != null) 
    { 
     w.WriteLine(string.Format(@"'{0}',",line)); 
    } 
    } 
} 
+0

«File.WriteAllLines» требует массив строки вместо enumberable покажет вам неверный аргумент –

+0

ah..it отлично работает с .net 4.0, но не с 3.5 –

+1

В любом случае, вы напомнили мне добавить эффективную версию :) –

0

вы можете попробовать это с помощью Linq

//read the fine and alter it by Select Function 
     var lines = File.ReadAllLines("file.txt").Select(item => string.Format("'{0}',",item)).ToArray(); 
    //write the lines to disk 
    File.WriteAllLines("file02.txt",lines); 
0

Попробуйте это -

var file = File.ReadLines("path"); 
var sb = new StringBuilder(); 
foreach (var t in file) 
{ 
    if(!string.IsNullOrWhiteSpace(t)) 
     sb.AppendLine("'" + t + "',"); 
} 
File.WriteAllLines("path", new string[] { sb.ToString() });