2011-08-24 7 views
14

テキストファイルからデータセットを埋め込む方法については、オンラインで多くの例がありますが、その逆を行いたいと思います。私が見つけることができる唯一のものはthisですが、それは不完全なようですか?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 

注:ここで私が何を意味するかの例がある私はそう私のデータセット内の複数のDataTableを心配する必要が1つのDataTableを持っていません。

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

ありがとうございます。

+0

固定されたフォントで整列するだけであることはわかっていますか? –

+0

はい、私はそれを知っています。 – bobble14988

答えて

15

これはうまくスペースアウト、固定長フォントテキストをする必要がありますが、それは二回フルのDataTableを処理することを意味しない(パス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(); 
     } 
    } 
+0

魅力的な作品です。データセットを2回繰り返しても問題ありません。このソリューションを検討している他の人は、大規模なデータセットを扱う場合、代替案を検討したいかもしれません。ありがとう、ロイ! – bobble14988

+0

データセット内に複数のデータテーブルを作成する方法 –

+0

@SwethaVijayanはDataTableではなく引数としてDataSet(たとえば 'ds')を渡し、' foreach(ds.TablesのDataTable dt) '行をその行の上に挿入します'foreach(dt.RowsのDataRow行)'と書いてあります –

8

xml形式にデータをエクスポートする方がよいでしょう。ちょうどあなたのデータテーブルの行を反復して行を追加します。

DataSet ds = new DataSet(); 
ds.ReadXml(fileName); 
0

:あなたは、XMLを読み、以下のようなデータセットのデータを埋めることができ

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

データセットは、この作品のための方法を持っています提供された例のようにファイルに追加します

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はStreamWritですデータを保存する場所にファイルを保存します。実際にどこに問題がありますか?私はどうなるのか

6

です:あなたは、ヘッダーをしたい場合

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

は多分、ループの前に列名を追加します。私が思うに、それはやや単純ですが、そのトリックを行うべきです。

2

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

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

あなたが調整したリンクを読みました。カンマ区切りの形式でエクスポートするだけです。あなたがメンメンションのように輸出したい場合は、余分な努力が必要です。 LINQはあなたの仕事を大幅に縮小します。あなたがしなければならないことは:1)データテーブルの各列の最大幅を計算します(LINQを使用すると、これは1つの文で行うことができます。そうでなければforeachの助けを借りなければなりません)。 2)実際のセルの値をテキストファイルに書き込む前に、String.Formatを使用して、計算された幅に従って第1ステップで配置します。

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

ご希望の場合は、この情報が役立ちます。

関連する問題