C# 不要用逗号分割字符串

Posted

技术标签:

【中文标题】C# 不要用逗号分割字符串【英文标题】:C# Do not split string on comma 【发布时间】:2019-02-22 21:19:25 【问题描述】:

我正在使用 Xamarin.Forms 创建数据收集应用程序。此应用程序的一个特殊功能是通过 csv 导出数据。捕获数据后,使用以下方法将数据写入文本文件:

 public void WriteToFile(string CompanyName, string Website, string FirsttName, string LastName, string JobTitle, string Phone, string Email, string Solution, string Notes, string ContactOwner, string EventName)
    
        string path = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        string filename = System.IO.Path.Combine(path, "Prospects.txt");
        string lineToBeAdded = string.Format("0,1,2,3,4,5,6,7,8,9,10", CompanyName, Website, FirsttName, LastName, JobTitle, Phone, Email, Solution, Notes, ContactOwner, EventName);
        File.AppendAllText(filename, lineToBeAdded + Environment.NewLine);


    

我的问题是,在变量 NOTES 中,用户在描述中使用了逗号,这弄乱了 csv 的结构。

如何强制忽略此字符串中的逗号?

【问题讨论】:

通常你会用双引号将该字段括起来。这将取决于您的消费者是否尊重该约定。当然,您现在还必须适应包含双引号的字符串。如果字符串中包含\" 之类的内容,则可能会变得更加棘手。 见RFC 4180。 您会受益于使用可以为您处理格式的 CSV 库。想到了 CsvHelper。 使用 \t 分隔符 如果列没有字符串封装字符(通常是双引号)以及字符串封装字符的转义字符(通常是第二个双引号),那么您不会有什么好方法可以读取这些数据。生成此 CSV 的任何人都需要再试一次。格式正确的行将是; 1, f2, "this is, a single column of ""data""" 【参考方案1】:

要在双引号中转义逗号扭曲每列,要转义双引号,请使用 2 个双引号而不是每个:

 string lineToBeAdded = string.Format("\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"10\"", 
CompanyName.Replace("\"","\"\""),
 Website.Replace("\"","\"\""),
 FirsttName.Replace("\"","\"\""),
 LastName.Replace("\"","\"\""),
 JobTitle.Replace("\"","\"\""),
 Phone.Replace("\"","\"\""),
 Email.Replace("\"","\"\""),
 Solution.Replace("\"","\"\""),
 Notes.Replace("\"","\"\""),
 ContactOwner.Replace("\"","\"\""),
 EventName.Replace("\"","\"\""));

【讨论】:

如果其中一个变量值包含引号怎么办? @Chris,这个答案正确地处理了这种情况,方法是将任何包含的引号加倍,然后用引号将每个字段括起来。【参考方案2】:

解决方案

创建这个函数:

string GetCsvLine(params string[] fields) =>
   string.Join(",", fields.Select(x => $"\"x.Replace("\"", "\"\"")\""));

并像这样调用它,替换示例代码中初始化“lineToBeAdded”的行:

string lineToBeAdded = GetCsvLine(CompanyName, Website, FirsttName, LastName, JobTitle, Phone, Email, Solution, Notes, ContactOwner, EventName);

说明

请参阅here - RFC4180 - CSV 规范:

总结:

如果字段包含逗号、换行符或双引号,则必须用双引号括起来。 字段的任何双引号本身都必须加倍。 奖励:使用 'params' 和 LINQ 允许您使用可变数量的参数调用此方法,无需使用具有确切数量的占位符的格式字符串。

【讨论】:

【参考方案3】:

你也不必使用逗号,你可以使用 |或其他用户不使用的东西。

为了更友好你可以在第一行指定分隔符,我知道excel支持。

sep=|
header1|header2|header3
1,2|2,3|3,4

【讨论】:

以上是关于C# 不要用逗号分割字符串的主要内容,如果未能解决你的问题,请参考以下文章

函数用逗号分割字符串,插入两列

用逗号分割字符串,但忽略括号或引号中的逗号

javascript 用逗号和无限空格分割字符串

如何在每个字符串之间用逗号分割数组?

oracle 用逗号分割一个带引号的字符串

jquery中如何以逗号分割字符串