2009-09-02 24 views
9

Por ejemplo, tengo un archivo txt que dice:¿Cómo leo y edito un archivo .txt en C#?

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

quiero insertar una coma entre todos los números, agregar una llave de apertura al comienzo de cada línea y una llave derecha al final de cada línea. Entonces, después de la edición debería decir:

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

¿Cómo lo hago?

Respuesta

1

yo más o menos lo descubrió mientras estaba a mi dando a sus respuestas, pero muchas gracias de todos modos :). Se me ocurrió esto:

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

En lugar de un bucle for infinito con una interrupción, debe utilice un ciclo while como el siguiente: while (reader.Peek()> -1) –

+3

Evitaría el infinito para los bucles (;;), parece un estilo incorrecto. Puede simplificar esto como "while ((s = reader). Readline())! = Null) {....} –

3

Tendrá que utilizar la clase FileStream para abrir el archivo, la clase StreamReader para leer desde el archivo y la clase StreamWriter para volver a escribir en el archivo.

Se puede crear un FileStream así:

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

luego envolver la FileStream en un StreamReader:

StreamReader reader = new StreamReader(file); 

A continuación, lea en cada línea y hacer su procesamiento de cadenas (comas añadir y soportes):

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

Por último, envuelva el FileStream en un StreamWriter y escribir sus cadenas modificadas de nuevo al archivo:

StreamWriter writer = new StreamWriter(file); 

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

No se olvide de cerrar los flujos después de trabajar con ellos.

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

Tengo una pregunta. Cuando abro el mismo archivo, ¿debo volver a escribir todos los datos? no solo los datos editados –

3

Lea cada línea.

Añadir un soporte antes de la cadena y después de

A continuación, reemplace el espacio "" por "" (coma y espacio)

5

se debe trabajar en la lógica de primer lugar de preguntar directamente a las personas a establecer que para tú. En cuanto a la lectura/escritura de un archivo, aquí van:

//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

Debe usar las instrucciones de uso para asegurarse de que los objetos (FileStreams, StreamReaders y StreamWriters se desechen correctamente. –

1
  1. carga todo el archivo
  2. uso string.split ('\ n') para dividir el contenido en líneas
  3. el uso de cadenas. replace ('', ',') para insertar comas.
  4. Guarde el archivo.

O, como dijo waqasahmed, hazlo uno en línea.

Consulte también: http://www.csharphelp.com/archives/archive24.html

Además, esto suena sospechosamente a un problema de tarea. Tal vez deberíamos tener una etiqueta de "tarea"?

13

Algo como esto: (no probado)

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 para garantizar que los objetos se eliminen correctamente –

3

de edición para añadir cómo modificar sLine.(No probado, pero estoy bastante seguro de que va a trabajar muy bien)

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

añadido algunas LINQ para la diversión y el beneficio (espacio para la optimización;)):

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

Todo en una sola declaración! Inmejorable :-D –

Cuestiones relacionadas