crea un testo delimitato in c # con colonne separate

Ho cercato di creare un file di testo con tabulazioni in c # in modo che i dati vengano visualizzati correttamente in colonne separate.

Firstname Lastname Age John Smith 17 James Sawyer 31 

Ho provato il carattere “\ t” ma tutto ciò che ottengo è questo:

 Firstname Lastname Age John Smith 17 James Sawyer 31 

Ecco il mio codice:

 string[,] P = new string[2, 3] { { "John", "Smith", "17" }, { "James", "Sawyer", "31" } }; using (StreamWriter s_w = new StreamWriter(target)) { s_w.WriteLine("Firstname \t Lastname \t Age"); for (int i = 0; i < 2; i++) { s_w.WriteLine("{0} \t {1} \t {2}", P[i,0], P[i,1], P[i,2]); } } 

    Puoi usare PadRight questo modo:

      s_w.WriteLine("{0} \t {1} \t {2}", P[i, 0].PadRight(10, ' '), P[i, 1].PadRight(10, ' '), P[i, 2].PadRight(10, ' ')); 

    Nota che l’ultimo PadRight non è necessario perché è l’ultima colonna. Non è necessario aggiungere nulla alla destra. Comunque se hai più proprietà allora devi usarlo anche tu.

    Usa string.Format e la funzione di precisione della formattazione composita ti consente di preparare il testo in colonne con il numero esatto di caratteri per ogni colonna

     string[,] P = new string[2, 3] { { "John", "Smith", "17" }, { "James", "Sawyer", "31" } }; using (StreamWriter s_w = new StreamWriter(target)) { string row = string.Format("{0,-30}{1,-30}{2,10}", "Firstname", "Lastname", "Age"); s_w.WriteLine(row); for (int i = 0; i < 2; i++) { row = string.Format("{0,-30}{1,-30}{2,10}", P[i,0], P[i,1], P[i,2]); s_w.WriteLine(row); } } 

    questo allineerà i tuoi dati in tre colonne, la prima è di 30 caratteri e il testo è allineato a sinistra, lo stesso per la seconda colonna, mentre la terza colonna è di 10 caratteri e i dati (età) sono allineati a destra .

    Ovviamente per vedere un allineamento esatto della tua colonna devi guardare i tuoi dati usando un font a larghezza fissa (Courier o Lucida Console per esempio) altrimenti vedrai le colonne disallineate, ma questo è dovuto al fatto che in un font a larghezza variabile la lettera W bisogno di più pixel nell'orizzontale rispetto alla lettera i

    Quello che stai vedendo è dovuto al modo in cui le tabs vengono visualizzate nell’output. Sembra correttamente delimitato da tabulazioni, è solo che le lunghezze diverse fanno sì che le tabs si allineino a diverse interruzioni di tabulazione.

    Se questo deve essere visualizzato in una console, provare a utilizzare gli spazi per il riempimento per riempire ciascuna colonna con lo stesso numero di caratteri.

    Vedere le risposte a questa domanda per suggerimenti, ma l’essenza è:

     String.format("%10s", P[i,0]); 

    e così via per ciascuno degli altri.

    Se in realtà dovrebbe essere letto come dati, quindi lasciare come è, perché è corretto ora (anche se probabilmente si desidera rimuovere gli spazi nella stringa (ad esempio "{0}\t{1}\t{2}" .

    Ciao: Se hai assolutamente bisogno di usare i caratteri TAB (cioè, se devi generare un file che può essere facilmente letto in Microsoft Excel, come un file di testo separato da TAB), lo stai facendo correttamente, perché sei usando solo un TAB tra ogni due colonne. MA, se quello che vuoi è visualizzare le colonne ben distanziate, allora ti suggerisco di usare spazi, invece di caratteri TAB. È più facile da gestire. Cerca tra tutte le tue stringhe, trova la stringa più larga, assegna questo valore più 5, ad esempio, quindi assegna le stringhe usando quella conoscenza (ad esempio, aggiungendo tutti gli spazi necessari per rendere tutte le colonne allineate). Se hai bisogno di aiuto con il codice, posso postare qualcosa più tardi. Ma fammi sapere, per favore.

    Penso che tu voglia riempire i tuoi dati con spazi invece di tabulazioni, che non sempre si allineano:

     s_w.WriteLine("Firstname Lastname Age"); for (int i = 0; i < 2; i++) { s_w.WriteLine("{0,-20} \t {1,-20} \t {2}", P[i,0], P[i,1], P[i,2]); } ^-- the -20 tells the formatter to left-align and pad to 20 characters 

    La risposta di Selman22 ha fatto completamente il lavoro, ecco un’altra soluzione un po ‘più concisa:

     string[,] P = new string[2, 3] { { "John", "Smith", "17" }, { "James", "Sawyer", "31" } }; using (StreamWriter s_w = new StreamWriter(target)) { s_w.WriteLine("{0,-15} {1,-15} {2,-15}","Firstname", "Lastname" ,"Age"); for (int i = 0; i < 2; i++) { s_w.WriteLine("{0,-15} {1,-15} {2,-15}", P[i, 0], P[i, 1], P[i, 2]); } }