如何替换c#中来自csv文件的字符串字段中的日期格式
本文关键字:文件 csv 字符串 格式 日期 字段 何替换 替换 | 更新日期: 2023-09-27 17:53:07
我有一个包含多个字段的csv文件,其中一个字段是包含注释的字符串字段,其中包括dd MMM yyyy格式的日期。我需要将这些日期转换为MM/dd/yyyy hh: MM:ss格式。我以前从来没有处理过文件,所以我把所有事情分成几个步骤,开始一步一步地研究
- 打开、读取和解析文件到不同的字段
- 在每个字段中搜索dd MMM yyyy日期
- 将日期替换为MM/dd/yyyy 00:00格式的日期
- 将新数据写回来自 的字段
- 关闭
我已经走到第二步了,但是我很难再走得更远,我开始想,也许我走第一步和第二步的方式不是最好的方式。我一直在尝试使用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)?
试试这个:
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);