【问题标题】:CSV file creation is shorter than expectedCSV 文件的创建时间比预期的要短
【发布时间】:2017-08-18 10:44:58
【问题描述】:

我正在创建一个 CSV 文件,我正在使用 C# 和 CsvHelper 来执行此操作。

我的 CSV 文件每次都会有 205 行。我确定它应该创建 240 个条目,这正是我想要的。

似乎在 205 行处停止创建 CSV 文件。多次运行它会产生相同的 205 条目的结果。有趣的是,它尝试写入的最后一个字段是一个短字母,我不知道为什么。

以下是完整代码。

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using CsvHelper;
using System.IO;

namespace PinGenerator
{
    class Program
    {
        static void Main(string[] args)
        {
            GeneratePins generatePins = new GeneratePins();
            generatePins.Start();
            Console.ReadLine();
        }
    }

    public class GeneratePins
    {
        private Dictionary<string, String> pinNumbers = new Dictionary<string, String>();
        private List<String> duplicatePinCheck = new List<string>();
        private Random random = new Random();

        // Runs the sequence for the generation of TimeSpans & Pin Numbers.
        // Stores these into JSON / CSV Files
        public void Start()
        {            
            TimeSpan timeSpan = new TimeSpan();
            TimeSpan maxTime = TimeSpan.FromHours(2);

            TimeSpan currentTimeSpan = TimeSpan.FromSeconds(30);
            string currentPin = "0000";

            // CSV File Creation
            TextWriter textWriter = File.CreateText(@"pinNumber.csv");
            var csv = new CsvWriter(textWriter);

            while (timeSpan.Duration() < maxTime.Duration())
            {
                // Create TimeSpan & Pin
                timeSpan = timeSpan.Add(currentTimeSpan);
                currentPin = RandomNumber();

                // Duplicate Check
                while (duplicatePinCheck.Contains(currentPin))
                {
                    currentPin = RandomNumber();
                }
                duplicatePinCheck.Add(currentPin);

                // Cache Results
                string entryPinNumber = currentPin;
                string entryTimeSpan = timeSpan.ToString();

                // JSON
                pinNumbers.Add(entryTimeSpan, currentPin);

                // CSV Creation - Write to CSV File
                csv.WriteField(entryTimeSpan);
                csv.WriteField(entryPinNumber);
                csv.NextRecord();

                // CONSOLE
                Console.WriteLine(entryPinNumber + " / " + timeSpan.ToString());          
            }
            string json = JsonConvert.SerializeObject(pinNumbers, Formatting.Indented);

            // Write to JSON File
            using (System.IO.StreamWriter file = File.CreateText(@"pinNumbers.json"))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.Serialize(file, pinNumbers);
            }
            Console.WriteLine("Created " + pinNumbers.Count() + " pin numbers.");
        }

        public string RandomNumber()
        {
            String result = random.Next(0, 9999).ToString();
            result = result.PadLeft(4, '0');
            return result;
        }
    }
}

【问题讨论】:

  • 请不要在元评论中编辑关于对您的问题的反对意见。它不仅被认为是噪音,我可以向您保证它只会导致更多的反对意见。就建设性的技术批评而言,我看到的一个问题是您包含了您的完整代码,而不是minimal reproducible example。有些人可能会认为这是值得一票的,因为它使回答对他们来说有更多的工作。否则,这在我看来相当合理。 2个downvotes真的不是很多。这可以通过问一个专家认为不是特别有趣的问题来解释。
  • 好的,谢谢科迪·加里。作为记录,我确实更喜欢提供更小的 sn-ps 代码,我很高兴将其缩减。通常我会被要求提供更多,我想它知道余额是多少。

标签: c# csv export-to-csv csvhelper


【解决方案1】:
TextWriter textWriter = File.CreateText(@"pinNumber.csv");

需要改成

StreamWriter streamWriter = File.CreateText(@"pinNumber.csv");

【讨论】:

  • 据我所知,问题不在于TextWriter,而是您既不调用 `.Dispose()'(你应该调用)也没有调用 '.Flush()' 的事实任何作家。你甚至说最后一个值是一个字母短。当然是,其余的从来没有冲过。第一部分可能只是因为内部缓冲区被完全填满而写的。
  • 啊,谢谢米尔斯特。我想将它更改为 StreamWriter 时它起作用的原因是因为它会自己处理内部缓冲区?
  • StreamWriter 也必须被释放(此时它将刷新所有剩余的内容)。我假设您在某些时候会遇到同样的问题。为了安全起见,请将您的编写器包装在 using 语句中,因为在它的最后,它会自动被释放,并且您不能忘记这样做。
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 1970-01-01
  • 2018-10-30
相关资源
最近更新 更多