オンラインでテキストファイルから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について心配する必要はありません。
編集:私が「可読」と言ったとき、私は人間が読めることを意味しました。
前もって感謝します。
これにより、固定長のフォントテキストが適切に配置されますが、完全な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();
}
}
データをxml形式でエクスポートすることをお勧めします。
データセットには、この作業のためのメソッドがあります。
DataSet ds = new DataSet();
ds.WriteXml(fileName);
以下のようにxmlを読み取ってデータセットデータを入力できます。
DataSet ds = new DataSet();
ds.ReadXml(fileName);
私がすることは:
foreach (DataRow row in myDataSet.Tables[0].Rows)
{
foreach (object item in row.ItemArray)
{
myStreamWriter.Write((string)item + "\t");
}
myStreamWriter.WriteLine();
}
ヘッダーが必要な場合は、ループの前に列名を追加してください。かなり単純ですが、トリックを実行する必要があると思います。
以下はどうですか?
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();
}
提供されている例のように、データテーブルの行を反復処理して、ファイルに行を追加するだけです
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です。実際にどこに問題がありますか?
私はソフトウェア業界の初心者で、あなたを助けようとしています。これはあなたの問題の最終的な解決策ではないかもしれません。
あなたが言及したリンクを読みました。唯一のコンマ区切り形式でのエクスポートは事実です。あなたがあなたのようにエクスポートしたいなら、あなたはいくつかの追加の努力をしなければなりません。 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();
}
これがお役に立てば幸いです。