C# 读取csv文件
原文链接:https://bravenewmethod.com/2014/09/13/lightweight-csv-reader-for-unity/
using UnityEngine
;
using System
;
using System
.Collections
;
using System
.Collections
.Generic
;
using System
.Text
.RegularExpressions
;
public class CSVReader
{
static string SPLIT_RE
= @",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))";
static string LINE_SPLIT_RE
= @"\r\n|\n\r|\n|\r";
static char[] TRIM_CHARS
= { '\"' };
public static List
<Dictionary
<string, object>> Read(string file
)
{
var list
= new List<Dictionary
<string, object>>();
TextAsset data
= Resources
.Load
(file
) as TextAsset
;
var lines
= Regex
.Split
(data
.text
, LINE_SPLIT_RE
);
if(lines
.Length
<= 1) return list
;
var header
= Regex
.Split(lines
[0], SPLIT_RE
);
for(var i
=1; i
< lines
.Length
; i
++) {
var values
= Regex
.Split(lines
[i
], SPLIT_RE
);
if(values
.Length
== 0 ||values
[0] == "") continue;
var entry
= new Dictionary<string, object>();
for(var j
=0; j
< header
.Length
&& j
< values
.Length
; j
++ ) {
string value = values
[j
];
value = value.TrimStart(TRIM_CHARS
).TrimEnd(TRIM_CHARS
).Replace("\\", "");
object finalvalue
= value;
int n
;
float f
;
if(int.TryParse(value, out n
)) {
finalvalue
= n
;
} else if (float.TryParse(value, out f
)) {
finalvalue
= f
;
}
entry
[header
[j
]] = finalvalue
;
}
list
.Add
(entry
);
}
return list
;
}
}
其中的正则表达式
@",(?=(?:[^""]*""[^""]*"")*(?![^""]*""))"
这一段是匹配一个逗号,并且这个逗号后面需要跟着偶数个引号("),搞清楚这个之后整段代码就比较明了了。举个例子
Regex
.Split("25,\"Hello, world!\",\"More \"text\",123.45", SPLIT_RE
);
这一段会匹配到world和123.45前面的逗号从而拆成3段。