将DataTable中的行写入文本文件

10
public void GenerateDetailFile()
{
  if (!Directory.Exists(AppVars.IntegrationFilesLocation))
  {
    Directory.CreateDirectory(AppVars.IntegrationFilesLocation);
  }

  DateTime DateTime = DateTime.Now;
  using (StreamWriter sw = File.CreateText(AppVars.IntegrationFilesLocation +
                                DateTime.ToString(DateFormat) + " Detail.txt"))
  {
    DataTable table = Database.GetDetailTXTFileData();

    foreach (DataRow row in table.Rows)
    {
      sw.WriteLine(row);
    }
  }
}

我不确定我漏掉了什么,但我认为可能是列名,而我不知道如何设置它。

这个运行良好,只是当它写入文本文件时,它会写入以下内容:

System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow
System.Data.DataRow

有人能帮我吗?


2
类似于 sw.WriteLine(row["columnname"].ToString()); 这样的语句会更加适合。 - Michael
writeLine(row[0].ToString()) 能正常工作。谢谢 :) - JJ.
6个回答

19
当你尝试打印出一个类似于DataRow的对象时,它会调用Object.ToString()方法,该方法只会输出类型的名称。你需要做的是像下面这样处理:
sw.WriteLine(String.Join(",", row.ItemArray));

这将打印出一个由逗号分隔的列表,其中包含DataRow中的所有项目。

9

Something like:

sw.WriteLine(row["columnname"].ToString());

更加合适的做法是。


为什么它会在最后一行给出空的新行? - python gbs
@pythongbs 我需要看到表格中的数据(也许需要知道你使用的数据库等)才能回答这个问题。 - Michael

5
以下代码将让您每列使用“|”分隔符编写文本文件。
    foreach (DataRow row in dt.Rows)
      {  
         object[] array = row.ItemArray;
         for (int i = 0; i < array.Length - 1; i++)
         {
           swExtLogFile.Write(array[i].ToString() + " | ");
         }
          swExtLogFile.WriteLine(array[array.Length - 1].ToString());             
     }

Reference link


修复:第4行“i =”应改为“int i =”,第8行“array [i]”应改为“array [array.Length-1]”。 - Will

4

DataRow没有“自然”的字符串表示形式。您需要以任何格式编写它,例如:值的逗号分隔列表等。您可以枚举列并打印它们的值,例如:

foreach (DataRow row in table.Rows)
{
    bool firstCol = true;
    foreach (DataColumn col in table.Columns)
    {
        if (!firstCol) sw.Write(", ");
        sw.Write(row[col].ToString());
        firstCol = false;
    }
    sw.WriteLine();
}

你不觉得每个 row[col] 都会遇到同样的问题吗? - Robert Harvey
@RobertHarvey:不再了 :) 虽然我认为使用 sw.Write(row[col] 也可以正常工作。 - mellamokb

1

您需要从每个DataRow中编写列。目前,您正在编写的是DataRow对象,即dataRow.ToString(),因此您在文件中得到了数据行的字符串名称"System.Data.DataRow"

foreach(DataRow row in table.Rows)
{
 foreach(DataColumn column in table.Columns)
 {
  sw.WriteLine(row[column]);
 }
}

1

请尝试以下操作:

将DataTable行写入特定目录的文本文件中

            var dir = @"D:\New folder\log";  // folder location

            if (!Directory.Exists(dir))  // if it doesn't exist, create
                Directory.CreateDirectory(dir);

            foreach (DataRow row in dt.Rows)
            {
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    result.Append(row[i].ToString());
                    result.Append(i == dt.Columns.Count - 1 ? "\n" : ",");
                }
                result.AppendLine();
            }
            string path = System.IO.Path.Combine(dir, "item.txt");
            StreamWriter objWriter = new StreamWriter(path, false);
            objWriter.WriteLine(result.ToString());
            objWriter.Close();

嗨,这个StringBuilder的结果是什么? - user2513019
什么是“result”? - Mattias Sturebrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接