web-dev-qa-db-ja.com

C#DataSetをテキストファイルにエクスポートする

オンラインでテキストファイルからDataSetにデータを入力する方法の例はたくさんありますが、私は逆にしたいと思います。私が見つけることができた唯一のものは this ですが、それは...不完全ですか?

カンマで区切るだけでなく、読みやすい形式にする必要があるので、意味がある場合は、各行の列の間隔を等しくしないでください。これが私の意味の例です:

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

注:DataSetにはDataTableが1つしかないため、複数のDataTableについて心配する必要はありません。

編集:私が「可読」と言ったとき、私は人間が読めることを意味しました。

前もって感謝します。

19
bobble14988

これにより、固定長のフォントテキストが適切に配置されますが、完全なDataTableが2回処理されることを意味します(パス1:列ごとに最も長いテキストを検索、パス2:出力テキスト)。

    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

データをxml形式でエクスポートすることをお勧めします。

データセットには、この作業のためのメソッドがあります。

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

以下のようにxmlを読み取ってデータセットデータを入力できます。

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

私がすることは:

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

ヘッダーが必要な場合は、ループの前に列名を追加してください。かなり単純ですが、トリックを実行する必要があると思います。

6
slawekwin

以下はどうですか?

 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

提供されている例のように、データテーブルの行を反復処理して、ファイルに行を追加するだけです

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は、データを保存するファイルへのStreamWriterです。実際にどこに問題がありますか?

0
Tigran

私はソフトウェア業界の初心者で、あなたを助けようとしています。これはあなたの問題の最終的な解決策ではないかもしれません。

あなたが言及したリンクを読みました。唯一のコンマ区切り形式でのエクスポートは事実です。あなたがあなたのようにエクスポートしたいなら、あなたはいくつかの追加の努力をしなければなりません。 LINQは作業を大幅に削減します。あなたがしなければならないのは:1)データテーブルの各列の最大幅を計算します(LINQを使用すると、これは1つのステートメント自体で実行できます。それ以外の場合は、foreachを利用する必要があります)。 2)実際のセル値をテキストファイルに書き込む前に、最初のステップで計算された幅に従って配置するためにString.Formatを使用します。

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

これがお役に立てば幸いです。

0