尝试将嵌套的字符串列表导出到文本或csv文件c#

时间:2016-12-16 10:40:17

标签: c# list csv export streamreader

我正在尝试将嵌套列表中的字符串导出到用户选择的txt或csv文件中,并且一切似乎都正常工作但是当我实际上在导出文件后检查文件时,文件绝对是空白的。我去了一个单独的测试程序,以模拟我的问题,它在该程序上工作,但当我移动代码时,它仍然不会导出任何东西。

这只是我初始化的嵌套列表,如果需要的话。

List<List<string>> aQuestion = new List<List<string>>();

这是代码的问题区域。

static void writeCSV(List<List<string>> aQuestion, List<char> aAnswer)
    {
        StreamWriter fOut = null;
        string fileName = "";

        //export questions
        //determine if the file can be found
        try
        {
            Console.Write("Enter the file path for where you would like to export the exam to: ");
            fileName = Console.ReadLine();
            if (!File.Exists(fileName))
            {
                throw new FileNotFoundException();
            }
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("File {0} cannot be found", fileName);
        }

        //writes to the file
        try
        {
            fOut = new StreamWriter(fileName, false);
            //accesses the nested lists
            foreach (var line in aQuestion)
            {
                foreach (var value in line)
                {
                    fOut.WriteLine(string.Join("\n", value));
                }
            }
            Console.WriteLine("File {0} successfully written", fileName);
        }
        catch (IOException ioe)
        {
            Console.WriteLine("File {0} cannot be written {1}", fileName, ioe.Message);
        }

所以,如果你们中的任何一个人能帮助我解决这个问题,那将是很好的,因为它看起来像是一个小问题,但我无法理解为我的生活。

2 个答案:

答案 0 :(得分:0)

可能会发生缓冲区未刷新到磁盘的情况。您应该处理流编写器,它会将所有内容都推送到磁盘:

using (StreamWriter writer = new StreamWriter(fileName, false)) // <-- this is the change
{
    //accesses the nested lists
    foreach (var line in aQuestion)
    {
        foreach (var value in line)
        {
            writer.WriteLine(string.Join("\n", value));
        }
    }
}

在更复杂的层面上,通常可以缓冲可能导致性能损失的流。文件流肯定是缓冲的,因为将每个单独的数据立即推送到IO是非常低效的。

当您使用文件流时,可以使用StreamWriter.Flush()方法显式刷新其内容 - 如果您想调试代码并希望查看编写数据的距离,这非常有用。 / p>

但是,您通常不会自己刷新流,而只是让其内部机制选择最佳时机。相反,您确保处理流对象,这将在关闭流之前强制刷新缓冲区。

答案 1 :(得分:0)

使用这种简单的方法,它更容易,它将负责创建和处理StreamWriter。

File.WriteAllLines(PathToYourFile,aQuestion.SelectMany(x=>x));

有关File.WriteAllLines Here

的更多参考资料

另外,在你的代码中你没有处理StreamWrite。将其括在Using块中。像这样......

using(var writer = new StreamWriter(PathToYourFile,false)
{
   //Your code here
}