2009-09-02 15 views
9

Per esempio, ho un file txt che legge:Come faccio a leggere e modificare un file .txt in C#?

12 345 45 
2342 234 45 2 2 45345 
234 546 34 3 45 65 765 
12 23 434 34 56 76 5 

voglio inserire una virgola tra tutti i numeri, aggiungere una parentesi graffa sinistra per l'inizio di ogni riga e un tutore fino alla fine di ogni linea. Quindi dopo la modifica dovrebbe essere visualizzato:

{12, 345, 45} 
{2342, 234, 45, 2, 2, 45345} 
{234, 546, 34, 3, 45, 65, 765} 
{12, 23, 434, 34, 56, 76, 5} 

Come si fa?

risposta

1

ho praticamente capito mentre si stava tutti mi dando le risposte, ma grazie mille comunque :). Sono venuto con questo:

TextReader reader = new StreamReader("triangle.txt"); 
TextWriter writer = new StreamWriter("triangle2.txt"); 
for (; ;) 
{ 
    string s = reader.ReadLine(); 
    if (s == null) 
     break; 
    s = s.Replace(" ", ", "); 
    s = "{" + s + "},"; 
    writer.WriteLine(s); 
} 
+1

Invece di un ciclo infinito per un'interruzione, si dovrebbe usa un ciclo while come segue: while (reader.Peek()> -1) –

+3

Eviterei infinito per (;;) loops, sembra un cattivo stile. Puoi semplificarlo come "while ((s = reader. Readline())! = Null) {....} –

3

Avrete bisogno di usare la classe FileStream per aprire il file, la classe StreamReader da leggere dal file e la classe StreamWriter per riscrivere il file.

È possibile creare un FileStream come questo:

FileStream file = new FileStream("FileName", FileMode.Open, FileAccess.ReadWrite); 

poi avvolgere il FileStream in un StreamReader:

StreamReader reader = new StreamReader(file); 

Poi, letto in ogni riga e fare la vostra elaborazione delle stringhe (l'aggiunta di virgole e parentesi):

while(reader.EndOfFile) 
{ 
    string currentLine = reader.ReadLine(); 
    // do your string processing here and save the result somewhere 
} 

Infine, avvolgere il FileStream in un StreamWriter e scrivere le stringhe modificate indietro al file:

StreamWriter writer = new StreamWriter(file); 

// Write your content here 
writer.Write("my content"); 

Non dimenticare di chiudere i flussi dopo aver lavorato con loro.

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

Ho una domanda. Quando apro lo stesso file devo scrivere di nuovo tutti i dati scritti? non solo i dati modificati –

3

Leggere ogni riga.

Aggiungere una staffa prima della stringa e dopo

Quindi sostituire lo spazio "" da "" (virgola e spazio)

5

si dovrebbe lavorare sulla logica prima invece di chiedere direttamente alle persone di stabilire che, per tu. come per la lettura/scrittura di un file, qui si va:

//write  
FileStream fs = new FileStream("file_name", FileMode.Create); 
StreamWriter w = new StreamWriter(fs, Encoding.UTF8); 
w.WriteLine("text_to_write"); 
w.Flush(); 
w.Close(); 
fs.Close(); 

//read 
fs = new FileStream("file_name", FileMode.Open); 
StreamReader r = new StreamReader(fs, Encoding.UTF8); 
Console.WriteLine(r.ReadLine()); 
r.Close(); 
fs.Close(); 
+1

È necessario utilizzare le istruzioni per garantire che gli oggetti (FileStreams, StreamReader e StreamWriter siano stati eliminati correttamente. –

1
  1. carico l'intero file
  2. uso string.split ('\ n') per dividere il contenuto in linee
  3. uso stringa. sostituire ('', ',') per inserire virgole.
  4. Salvare il file.

Oppure, come ha detto waqasahmed, basta farlo in linea.

Consulta anche: http://www.csharphelp.com/archives/archive24.html

Inoltre, questo suona sospettosamente come un problema di compiti a casa. Forse dovremmo avere un tag "compiti"?

13

Qualcosa di simile a questo: (non testato)

string filename = @"c:\yourfilename.txt"; 
StringBuilder result = new StringBuilder(); 

      if (System.IO.File.Exists(filename)) 
      { 
       using (StreamReader streamReader = new StreamReader(filename)) 
       { 
        String line; 
        while ((line = streamReader.ReadLine()) != null) 
        { 
         string newLine = String.Concat("{", line, "}", Environment.NewLine); 
         newLine = newLine.Replace(" ", ", "); 
         result.Append(newLine); 
        } 
       } 
      } 

using (FileStream fileStream = new FileStream(filename , fileMode, fileAccess)) 
      { 
       StreamWriter streamWriter = new StreamWriter(fileStream); 
       streamWriter.Write(result); 
       streamWriter.Close(); 
       fileStream.Close(); 
      } 
+0

+1 per garantire che gli oggetti siano correttamente smaltiti –

3

Modifica per aggiungere come modificare sLine.(Non testato, ma sono abbastanza sicuro che funzionerà bene)

StreamReader sr = new StreamReader("path/to/file.txt"); 
    StreamWriter sw = new StreamWriter("path/to/outfile.txt"); 
    string sLine = sr.ReadLine(); 
    for (; sLine != null; sLine = sr.ReadLine()) 
    { 
     sLine = "{" + sLine.Replace(" ", ", ") + "}"; 
     sw.WriteLine(sLine); 
    } 
3
string [] lines = File.ReadAllLines("input.txt"); 
var processed = lines.Select(line => string.Format("{{{0}}}", line.Replace(" ", ", "))); 
File.WriteAllLines("output.txt",processed.ToArray()); 
18

aggiunto qualche LINQ per divertimento e profitto (spazio per l'ottimizzazione;)):

System.IO.File.WriteAllLines(
    "outfilename.txt", 
    System.IO.File.ReadAllLines("infilename.txt").Select(line => 
     "{" + 
     string.Join(", ", 
      line.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries) 
     ) + "}" 
    ).ToArray() 
); 
+0

Tutto in una singola istruzione! Imbattibile :-D –

Problemi correlati