使用正则表达式替换多个标头名称

时间:2018-11-12 09:50:50

标签: c# regex replace csvhelper

我目前正在制作一个可以读取csv文件并可以通过使用Regex和csvhelper替换标题名称的项目。

我有很多csv filse,有时它们具有不同的标头名称。这些是我的示例csv文件:

示例1:

BranchName,Latitude,Longitude
China,89.2422,121.1312

示例2:

Name,Lat,Long
New Zealand,21.1212,110.3141

示例3:

B_Name4,Lati12,Longitude21
Australia,34.1231,143.1231

如何将标题名称更改为正确的标题名称?像这样:

Branch_Name,Latitude,Longitude
China,89.2422,121.1312

到目前为止,我的代码是这样:

csv.Reader.Configuration.PrepareHeaderForMatch = header =>
{
var newHeader = Regex.Replace(header, "@([\w]\*name[\w]*)", "Branch_Name", RegexOptions.IgnoreCase);
newHeader = Regex.Replace(header, "@([\w]\*lat[\w]*)", "Latitude", RegexOptions.IgnoreCase);
newHeader = Regex.Replace(header, "@([\w]\*long[\w]*)", "Longitude", RegexOptions.IgnoreCase);

return newHeader;
}

在此代码中,正则表达式仅替换第一个匹配项。
我知道可以通过使用映射来实现,但是需要手动放置可能的标头名称。我想要的是动态替换标题。

1 个答案:

答案 0 :(得分:0)

我并不是真正地“融入” C#,但在我看来您需要:

  • 删除正则表达式中星号的反斜杠
  • 在第二和第三次“替换”操作中,用header替换newHeader

此外,\w周围的方括号不是必需的,因为您没有测试“以下任何字符”

您的代码如下:

csv.Reader.Configuration.PrepareHeaderForMatch = header =>
{
    var newHeader = Regex.Replace(header, @"(\w*Name\w*)", "Branch_Name", RegexOptions.IgnoreCase);
    newHeader = Regex.Replace(newHeader, @"(\w*Lat\w*)", "Latitude", RegexOptions.IgnoreCase);
    return Regex.Replace(newHeader, @"(\w*Long\w*)", "Longitude", RegexOptions.IgnoreCase);
}