テキストファイルからデータセットを埋める方法の例はオンラインでたくさんありますが、私はその逆を行いたいです。私が見つけることができたのはこれでも、どうやら…不完全なようですね?
カンマ区切りだけではなく、読みやすい形式にしたいので、各行の列間の間隔は不均等にしておきたいと思います。意味が通るかどうかは、次の例のとおりです。
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();
}
}