web-dev-qa-db-fra.com

Exporter un DataSet C # vers un fichier texte

Il existe de nombreux exemples en ligne sur la façon de remplir un DataSet à partir d'un fichier texte, mais je veux faire l'inverse. La seule chose que j'ai pu trouver est ceci mais cela semble ... incomplet?

Je veux qu'il soit dans un format lisible, pas seulement délimité par des virgules, donc un espacement non égal entre les colonnes de chaque ligne si cela a du sens. Voici un exemple de ce que je veux dire:

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

Remarque: Je n'ai qu'un seul DataTable dans mon DataSet donc pas besoin de s'inquiéter de plusieurs DataTables.

EDIT: Quand j'ai dit "lisible", je voulais dire lisible par l'homme.

Merci d'avance.

19
bobble14988

Cela devrait bien espacer le texte de la police de longueur fixe, mais cela signifie qu'il traitera le DataTable complet deux fois (passe 1: recherche le texte le plus long par colonne, passe 2: texte de sortie):

    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();
        }
    }
17
Roy Goode

il est préférable d'exporter vos données au format xml.

l'ensemble de données a une méthode pour ce travail:

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

vous pouvez lire un fichier xml et remplir les données de l'ensemble de données comme ci-dessous:

DataSet ds = new DataSet(); 
ds.ReadXml(fileName);
8
masoud ramezani

ce que je ferais c'est:

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

Ajoutez peut-être des noms de colonnes avant les boucles si vous voulez les en-têtes. Que je pense, bien qu'étant assez simple, devrait faire l'affaire.

6
slawekwin

qu'en est-il ci-dessous?

 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();
        }
2
Massimiliano Peluso

Parcourez simplement les lignes de votre tableau de données et ajoutez des lignes à votre fichier, comme dans l'exemple fourni

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();

}

sw est un StreamWriter vers un fichier où vous allez enregistrer des données. Où est réellement un problème?

0
Tigran

Je suis débutant dans l'industrie du logiciel et j'essaie juste de vous aider. Ce n'est peut-être pas une solution finale à votre problème.

J'ai lu le lien que vous avez ajouté. Il est vrai que sa seule exportation au format délimité par des virgules. Si vous souhaitez exporter comme vous le souhaitez, vous devez faire des efforts supplémentaires. LINQ réduira considérablement votre travail. ce que vous devez faire est de: 1) Calculer la largeur maximale de chaque colonne dans le tableau de données (en utilisant LINQ cela peut être fait dans une seule instruction sinon vous devez prendre l'aide de foreach). 2) avant d'écrire la valeur réelle de la cellule dans un fichier texte, utilisez String.Format pour le positionner en fonction de la largeur calculée lors de la première étape.

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();
        }

J'espère que vous trouverez cela utile.

0
Prateek Deshpande