如何在文本文件C#

时间:2017-03-31 12:45:07

标签: c#

我正在写一段代码,它接收访问日志并清理它。删除我不需要的所有数据,并给我一个干净的版本。我已经从redunadant数据清理它,但我需要重新格式化日期,这是文本文件中的一个字段。 (到目前为止,下面是已清理的文本文件)

enter image description here

我最初计划将它拆分为'/',然后将日期的3个元素放入一个数组(日,月,年)并重新排列,以便日期采用美国格式 - 但是这会打破'/'的文件路径,我不希望这样。

以下是我的代码到目前为止,我们非常感谢任何帮助或想法!

在这里输入代码

  StreamReader reader = new StreamReader(fileName);
        StreamWriter writer = new StreamWriter(newFileName);
        string line;

        string personalIdentifier = new string(fileName.Take(4).ToArray());
        string gender = fileName.Substring(fileName.Length - 5, 1);
        string classification = fileName.Substring(fileName.Length - 8, 2);
        string text = string.Empty;

        while ((line = reader.ReadLine()) != null)
        {
            string[] cleanArray;
            cleanArray = new string[7];

            var result = line.Split('"')
                 .Select((element, index) => index % 2 == 0
                  ? element.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
                  : new string[] { element })
                 .SelectMany(element => element).ToList();

            cleanArray[0] = personalIdentifier;
            cleanArray[1] = gender;
            cleanArray[2] = classification;
            cleanArray[3] = result[0];
            cleanArray[4] = result[3];
            cleanArray[5] = result[5];
            cleanArray[6] = result[6];

            //removing the [ at the start of the date
            cleanArray[4] = cleanArray[4].Substring(1);

            //re-formatting the date so that it can be accepted by machine learning
            var dateString = cleanArray[4];
            var date = DateTime.ParseExact(dateString, "dd/MMM/yyyy:HH:mm:ss", CultureInfo.InvariantCulture);
            var newDateString = date.ToString("yyyy-MM-dd HH:mm:ss");

            //push each clean array onto the file that has been automatically created at the top
            writer.WriteLine(string.Join(", ", cleanArray.Select(v => v.ToString())));
            writer.WriteLine();
        }
        reader.DiscardBufferedData();
        writer.Close();
        reader.Close();    
        }

2 个答案:

答案 0 :(得分:2)

您可以将String解析为DateTime,然后以您想要的格式将DateTime解析为String。这样的事情。

var dateString = "29/Oct/2014:13:36:07";
var date = DateTime.ParseExact(dateString, "dd/MMM/yyyy:HH:mm:ss", CultureInfo.InvariantCulture);
var newDateString = date.ToString("yyyy-MM-dd");

你会得到

  

2014年10月29日

如果您还需要时间,请将最后一个命令更改为

var newDateString = date.ToString("yyyy-MM-dd HH:mm:ss");

你会得到

  

2014-10-29 13:36:07

有关详细信息,请查看MSDN

答案 1 :(得分:0)

将数据存储在字符串fromat(或从中检索)非常棘手。您需要以下内容:

  • 用于存储字符串的编码
  • 用于存储DateTime的文化格式
  • 应用DateTime的时区。

我的第一个建议是永远不要将DateTimes存储或传输为字符串。失败了:

您可以确切地知道文件的编码。由于这是一个日志,它将保持旧的ASCII设置。编码在char 127下变得不那么相关.XML倾向于为你处理这部分。

文化格式是一个问题。默认情况下,ToString()和Parse()以及所有其他变体从Windows检索文化格式。仅仅因为它们使用相同的语言,并不意味着它们具有相同的格式。例如,英国和美国的日期格式完全不同。 所以总是选择一个固定的并硬编码。自动文化格式仅适用于直接用户输入,没有其他内容。

对于时区,我的建议是始终以UTC格式存储和检索。否则你必须适应原作者使用的时区(你可能不知道也可能不一致)和你自己的(你的DateTime.ToString()会为你做的)。