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

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

テキストファイルからデータセットを埋める方法の例はオンラインでたくさんありますが、私はその逆を行いたいです。私が見つけることができたのはこれでも、どうやら…不完全なようですね?

カンマ区切りだけではなく、読みやすい形式にしたいので、各行の列間の間隔は不均等にしておきたいと思います。意味が通るかどうかは、次の例のとおりです。

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 について心配する必要はありません。

編集: 「読み取り可能」と言ったのは、人間が読めるという意味です。

前もって感謝します。

ベストアンサー1

これにより、固定長フォントのテキストが適切に間隔をあけられるようになりますが、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();
        }
    }

おすすめ記事