如何替换c#中来自csv文件的字符串字段中的日期格式

本文关键字:文件 csv 字符串 格式 日期 字段 何替换 替换 | 更新日期: 2023-09-27 17:53:07

我有一个包含多个字段的csv文件,其中一个字段是包含注释的字符串字段,其中包括dd MMM yyyy格式的日期。我需要将这些日期转换为MM/dd/yyyy hh: MM:ss格式。我以前从来没有处理过文件,所以我把所有事情分成几个步骤,开始一步一步地研究

  1. 打开、读取和解析文件到不同的字段
  2. 在每个字段中搜索dd MMM yyyy日期
  3. 将日期替换为MM/dd/yyyy 00:00格式的日期
  4. 将新数据写回来自
  5. 的字段
  6. 关闭

我已经走到第二步了,但是我很难再走得更远,我开始想,也许我走第一步和第二步的方式不是最好的方式。我一直在尝试使用Regex .Replace(),但由于一些原因一直没有去任何地方:我试图改变的是foreach语句的一部分,所以VS不允许我改变它,但即使它做到了,Replace()方法接受字符串而不是Regex对象。下面是我尝试过的许多不成功的替换数据的方法之一。

static void Main(string[] args)
{   
    TextFieldParser MyReader = new TextFieldParser("C:''''Users''hacknj''Desktop''mo_daily_activity_20160627_1412.txt");
    MyReader.TextFieldType = FieldType.Delimited;
    MyReader.SetDelimiters(",");
    string[] currentRow;           
    while (!MyReader.EndOfData)
    {
        try
        {
            //Processing row
            currentRow = MyReader.ReadFields();
            foreach (string currentField in currentRow)
            {                       
                Regex badDate = new Regex(@"('s'd{2}'s[a-zA-Z]{3}'s'd{4})");
                Regex goodDate = new Regex(@"([0,1]?'d{1}'/(([0-2]?'d{1})|([3][0,1]{1}))'/(([1]{1}[9]{1}[9]{1}'d{1})|([2-9]{1}'d{3}))'s(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9]))");
                Match match = badDate.Match(currentField);
                string matchedDate = match.ToString();
                if (match.Success)
                {
                    currentField = Regex.Replace(currentField, badData, goodData);
                }                        
            }
        }
        catch (MalformedLineException ex)
        {
            MessageBox.Show("line " + ex.Message + "is not valid and will be skipped");
        }
    }            
    MyReader.Close();
}

所以问题是,是否有可能做我想做的我现在有我的代码的方式,或者我应该重新开始使用StreamReader/Writer(不幸的是,这些没有出现在我的研究,直到我得到了步骤3和4)?

如何替换c#中来自csv文件的字符串字段中的日期格式

试试这个:

foreach (string currentField in currentRow)
{
    // Define bad date
    Regex badDate = new Regex(@"('s'd{2}'s[a-zA-Z]{3}'s'd{4})");
    // Find Matches
    MatchCollection matches = badDate.Matches(currentField);
    // Go through each match
    foreach (Match match in matches)
    {
        // get the match text
        string matchText = match.Groups[0].ToString();
        // Define DateTime
        DateTime parsedDate;
        // If it parses
        if (DateTime.TryParseExact(matchText, "dd MMM yyyy", new CultureInfo("en-US"),
                DateTimeStyles.None, out parsedDate))
        {
            // Replace that specific text
            currentField = currentField.Replace(matchText,
                parsedDate.ToString("MM/dd/yyyy 00:00"));
        }
    }
}

如果这不起作用,我建议使用CSV文件操纵符或尝试以下操作:

string file = File.ReadAllText("C:''''Users''hacknj''Desktop''mo_daily_activity_20160627_1412.txt");
// Define bad date
Regex badDate = new Regex(@"('s'd{2}'s[a-zA-Z]{3}'s'd{4})");
// Find Matches
MatchCollection matches = badDate.Matches(file);
// Go through each match
foreach (Match match in matches)
{
    // get the match text
    string matchText = match.Groups[0].ToString();
    // Define DateTime
    DateTime parsedDate;
    // If it parses
    if (DateTime.TryParseExact(matchText, "dd MMM yyyy", new CultureInfo("en-US"),
            DateTimeStyles.None, out parsedDate))
    {
        // Replace that specific text
        file = file.Replace(matchText,
            parsedDate.ToString("MM/dd/yyyy 00:00"));
    }
}
File.WriteAllText("C:''''Users''hacknj''Desktop''mo_daily_activity_20160627_1412.txt", file);