SORU
10 ŞUBAT 2011, PERŞEMBE


c csv# datatable

Biri şu kodu çalışmıyor neden söyler. Veriler ayrı değil, ancak csv dosyasına kaydedilir. Her satırın ilk hücresi içinde var.

StringBuilder sb = new StringBuilder();

foreach (DataColumn col in dt.Columns)
{
    sb.Append(col.ColumnName   ',');
}

sb.Remove(sb.Length - 1, 1);
sb.Append(Environment.NewLine);

foreach (DataRow row in dt.Rows)
{
    for (int i = 0; i < dt.Columns.Count; i  )
    {
        sb.Append(row[i].ToString()   ",");
    }

    sb.Append(Environment.NewLine);
}

File.WriteAllText("test.csv", sb.ToString());

Teşekkürler.

CEVAP
10 ŞUBAT 2011, PERŞEMBE


Aşağıdaki kısa versiyonu Excel iyi açar, belki sorununuzu sondaki virgül oldu

.net = 3.5

StringBuilder sb = new StringBuilder(); 

string[] columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName).
                                  ToArray();
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    string[] fields = row.ItemArray.Select(field => field.ToString()).
                                    ToArray();
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("test.csv", sb.ToString());

.net >= 4.0

Tim ve eğer varsa işaret gibi .net>=4, hatta daha kısa yapabilirsiniz:

StringBuilder sb = new StringBuilder(); 

IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                  Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText("test.csv", sb.ToString());

Christian önerdiği gibi, eğer özel karakterler alanlarında kaçış işlemek istiyorsanız, döngü bloğu değiştirin:

foreach (DataRow row in dt.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => 
      string.Concat("\"", field.ToString().Replace("\"", "\"\""), "\""));
    sb.AppendLine(string.Join(",", fields));
}

Ve son önerim, bütün bir belge olarak hat yerine csv içeriği hattı, hafızasında büyük bir belge olması önlemek için yazabilirsiniz.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Hidden Wolf TV

    Hidden Wolf

    1 EKİM 2009
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010
  • Nickcidious

    Nickcidious

    6 HAZİRAN 2011