2011-08-24 68 views
14

Hay muchos ejemplos en línea sobre cómo llenar un DataSet de un archivo de texto, pero quiero hacer lo contrario. Lo único que he podido encontrar es this pero parece ... ¿incompleto?Exportar un C# DataSet a un archivo de texto

Quiero que esté en un formato legible, no solo delimitado por comas, por lo que el espaciado entre columnas no es igual en cada fila, si tiene sentido. Aquí está un ejemplo de lo que quiero decir:

Column1   Column2   Column3 
Some info  Some more info Even more info 
Some stuff here Some more stuff Even more stuff 
Bits    and    bobs 

Nota: Sólo tengo una DataTable dentro de mi conjunto de datos por lo que no hay necesidad de preocuparse por múltiples tablas de datos.

EDITAR: Cuando dije "legible" quise decir "legible por humanos".

Gracias de antemano.

+0

Sabes que solo se alineará con una fuente fija, ¿no? –

+0

Sí, lo sé. – bobble14988

Respuesta

15

Esto debería espaciar texto de la fuente de longitud fija muy bien, pero no significa que vaya a procesar la DataTable completa dos veces (paso 1: buscar texto más largo por columna, pasar 2: texto de salida):

static void Write(DataTable dt, string outputFilePath) 
    { 
     int[] maxLengths = new int[dt.Columns.Count]; 

     for (int i = 0; i < dt.Columns.Count; i++) 
     { 
      maxLengths[i] = dt.Columns[i].ColumnName.Length; 

      foreach (DataRow row in dt.Rows) 
      { 
       if (!row.IsNull(i)) 
       { 
        int length = row[i].ToString().Length; 

        if (length > maxLengths[i]) 
        { 
         maxLengths[i] = length; 
        } 
       } 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(outputFilePath, false)) 
     { 
      for (int i = 0; i < dt.Columns.Count; i++) 
      { 
       sw.Write(dt.Columns[i].ColumnName.PadRight(maxLengths[i] + 2)); 
      } 

      sw.WriteLine(); 

      foreach (DataRow row in dt.Rows) 
      { 
       for (int i = 0; i < dt.Columns.Count; i++) 
       { 
        if (!row.IsNull(i)) 
        { 
         sw.Write(row[i].ToString().PadRight(maxLengths[i] + 2)); 
        } 
        else 
        { 
         sw.Write(new string(' ', maxLengths[i] + 2)); 
        } 
       } 

       sw.WriteLine(); 
      } 

      sw.Close(); 
     } 
    } 
+0

Funciona como un encanto.No me importa iterar dos veces a través del conjunto de datos, ya que solo es pequeño. Otros que consideren esta solución pueden considerar alternativas si trabajan con grandes conjuntos de datos. Gracias, Roy! – bobble14988

+0

cómo se hace desde una tabla de datos múltiple en un conjunto de datos –

+0

@SwethaVijayan pase en el conjunto de datos (por ejemplo, 'ds') como un argumento en lugar de DataTable, luego inserte la línea' foreach (DataTable dt en ds.Tables) 'sobre la línea que dice 'foreach (fila de DataRow en dt.Rows)' –

8

es mejor que exporte sus datos a formato XML.

conjunto de datos tiene un método para este trabajo:

DataSet ds = new DataSet(); 
ds.WriteXml(fileName); 

se puede leer un xml y llenar los datos del conjunto de datos, como a continuación:

DataSet ds = new DataSet(); 
ds.ReadXml(fileName); 
0

Sólo iterar sobre las filas de la tabla de datos y añadir líneas a su archivo, al igual que en el ejemplo proporcionado

foreach (DataRow row in dt.Rows)    
{  

    object[] array = row.ItemArray;       
    for (i = 0; i < array.Length - 1; i++)     
    {        
    sw.Write(array[i].ToString() + ";");      
    }  

    sw.Write(array[i].ToString()); 

    sw.WriteLine(); 

} 

Dónde sw es una StreamWrit er a archivo donde va a guardar datos. ¿Dónde está realmente un problema?

6

lo que haría es:

foreach (DataRow row in myDataSet.Tables[0].Rows) 
{ 
    foreach (object item in row.ItemArray) 
    { 
     myStreamWriter.Write((string)item + "\t"); 
    } 
    myStreamWriter.WriteLine(); 
} 

añadir Tal vez los nombres de columna antes de que los bucles si desea que los encabezados. Eso creo, aunque es bastante simple, debería hacer el truco.

2

¿qué tal la continuación?

public static void Write(DataTable dt, string filePath) 
     { 
      int i = 0; 
      StreamWriter sw = null; 
       sw = new StreamWriter(filePath, false); 
       for (i = 0; i < dt.Columns.Count - 1; i++) 
       { 
        sw.Write(dt.Columns[i].ColumnName + " "); 
       } 
       sw.Write(dt.Columns[i].ColumnName); 
       sw.WriteLine(); 
       foreach (DataRow row in dt.Rows) 
       { 
        object[] array = row.ItemArray; 
        for (i = 0; i < array.Length - 1; i++) 
        { 
         sw.Write(array[i] + " "); 
        } 
        sw.Write(array[i].ToString()); 
        sw.WriteLine(); 
       } 
       sw.Close(); 
     } 
0

Soy un principiante en la industria del software y estoy tratando de ayudarte. Esto puede no ser una solución final para su problema.

He leído el enlace que lamentaron. Es cierto que solo está exportando en formato coma delimeted. Si desea exportar como usted, tiene que tomar algunos esfuerzos adicionales. LINQ reducirá su trabajo en gran medida. lo que tienes que hacer es: 1) Calcular el ancho máximo de cada columna en la tabla de datos (usando LINQ esto se puede hacer en una sola declaración, de lo contrario, tienes que tomar la ayuda de foreach). 2) antes de escribir el valor real de la celda en el archivo de texto, use String.Format para posicionar de acuerdo con el ancho calculado en el primer paso.

List<int> ColumnLengths = new List<int>(); 

     ds.Tables["TableName"].Columns.Cast<DataColumn>().All((x) => 
     { 
      { 
       ColumnLengths.Add(ds.Tables["TableName"].AsEnumerable().Select(y => y.Field<string>(x).Length).Max()); 
      } 
      return true; 
     }); 


     foreach (DataRow row in ds.Tables["TableName"].Rows) 
     { 
      for(int col=0;col<ds.Tables["TableName"].Columns.Count;col++) 
      { 
       SW.Write(row.Field<string>(ds.Tables["TableName"].Columns[col]).PadLeft(ColumnLengths[col] + (4 - (ColumnLengths[col] % 4)))); 
      } 
      SW.WriteLine(); 
     } 

Espero que te pueda resulta útil.

Cuestiones relacionadas