[英]c# comma separated string to list
我已經看到了一些使用Split(',')處理逗號分隔列表的示例,其中包含以下字符串:
string csv = "1,2,3,4,a,5";
List<string> parts = csv.Split(',').ToList<string>();
但是會發生什么,以及如何處理這樣的CSV字符串:
string csv = '"a,b","c,d","e","f",g,h,i';
我希望能夠將csv字符串解析為列表或數組,它更多的是知道處理包含逗號的字符串元素的最佳方法,而不是像Split這樣的簡單解析器來混淆額外的逗號。
阿列克謝的評論很有幫助,但在我的現實生活中嘗試它之后,他的解決方案陷入了一些障礙......所以需要額外的功勞..這是一個需要解析的更准確的csv字符串。
csv = '"name 1" <title 1>, "name, 2" <title 2>, name 3 <title 3>, name 4 <title 4>, name 5, name 6';
這些值將分為:
"name 1" <title 1>
"name, 2" <title 2>
name 3 <title 3>
name 4 <title 4>
name 5
name 6
謝謝
使用正則表達式來做到這一點。 這是最快捷,最簡單的方式。 確保將System.Text.RegularExpressions
添加到引用中。 將單引號和雙引號作為特殊字符,將它們刪除。 有關詳細信息,請參閱此帖
第二個字符串的普通C#解決方案。 它假定它是一個有效的CSV,令牌之間沒有空格。 我不認為它是最快的,但它應該足夠合理大小的數組(~MB)。 復雜性是O(n)
:
private static void AddToBuilder(IList<string> parts, StringBuilder sb)
{
if (sb.Length > 0)
parts.Add(sb.ToString());
sb.Clear();
}
static void Main(string[] args)
{
string csv = "\"a,b\",\"c,d\",\"e\",\"f\",g,h,i";
var parts = new List<string>();
bool innerString = false;
var sb = new StringBuilder();
foreach (var c in csv)
{
if (c == '\"')
{
if (innerString)
AddToBuilder(parts, sb);
innerString = !innerString;
continue;
}
if (c == ',' && !innerString)
{
AddToBuilder(parts, sb);
continue;
}
sb.Append(c);
}
AddToBuilder(parts, sb);
如果第三方CSV解析器不是一個選項,另一種選擇是Microsoft.VisualBasic.FileIO.TextFieldParser
(需要參考Microsoft.VisualBasic
):
string CSV = "\"a,b\",\"c,d\",\"e\",\"f\",g,h,i";
string[] fields;
using (var sr = new System.IO.StringReader(CSV))
using (var tfp = new Microsoft.VisualBasic.FileIO.TextFieldParser(sr)) {
tfp.SetDelimiters(",");
fields = tfp.ReadFields();
}
它還處理包含正確轉義引號的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.