csv本身可以用 OLEDB 数据库引擎读取。这里只是演示下这个算法using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string s = "123,123,\"12,123\",12,\"12,2\""; foreach (string item in MySplit(s, ',')) { Console.WriteLine(item); }
} static IEnumerable<string> MySplit(string source, char splitter) { string buffer = string.Empty; bool flag = false; for (int i = 0; i < source.Length; i++) { if (source[i] == (char)34) { flag = !flag; } else { if (source[i] == splitter && !flag) { yield return buffer; buffer = string.Empty; } else { buffer += source[i].ToString(); } } } if (buffer != string.Empty) yield return buffer; } } }
比较笨的办法
或者用正则分组,这个比较简单
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
string s = "123,123,\"12,123\",12,\"12,2\"";
foreach (string item in MySplit(s, ','))
{
Console.WriteLine(item);
}
} static IEnumerable<string> MySplit(string source, char splitter)
{
string buffer = string.Empty;
bool flag = false;
for (int i = 0; i < source.Length; i++)
{
if (source[i] == (char)34)
{
flag = !flag;
}
else
{
if (source[i] == splitter && !flag)
{
yield return buffer;
buffer = string.Empty;
}
else
{
buffer += source[i].ToString();
}
}
}
if (buffer != string.Empty) yield return buffer;
}
}
}
比较笨的办法
或者用正则分组,这个比较简单
http://blog.csdn.net/xianfajushi/article/details/7170572
string str = "123,123,\"12,123\",12,\"12,3,2\",3,\"5\"";
string[] result = Regex.Split(str, @"(?<!""(?:\d+,?)+),");
foreach (string s in result)
Console.WriteLine(s);
/*
123
123
"12,123"
12
"12,3,2"
3
"5"*/
3715,台,信息技术," 5,500.00 ",AMIN-1108-0189,A0411080189,平板电脑," 5,500.00 "
这是两条数据。
3715,台,信息技术," 5,500.00 ",AMIN-1108-0189,A0411080189,平板电脑," 5,500.00 "
这是两条数据。
那个好像不行。
string[] result = Regex.Split(str, @"(?<!""\s*\d+),");
foreach (string s in result)
Console.WriteLine(s);
/*
3457
台
信息技术
" 13,000.00 "
AMIN-1105-0537
A0411050537
笔记本
" 13,000.00 "
*/
string str = @"3457,台,信息技术,"" 13,000.00 "",AMIN-1105-0537,A0411050537,笔记本,"" 13,000.00 ""
3715,台,信息技术,"" 5,500.00 "",AMIN-1108-0189,A0411080189,平板电脑,"" 5,500.00 """;
Regex reg = new Regex(@"(?<!""\s*\d+),");
foreach (string s in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
{
foreach (string r in reg.Split(s))
Console.WriteLine(r);
Console.WriteLine(new string('*', 20));
}
/*
3457
台
信息技术
" 13,000.00 "
AMIN-1105-0537
A0411050537
笔记本
" 13,000.00 "
********************
3715
台
信息技术
" 5,500.00 "
AMIN-1108-0189
A0411080189
平板电脑
" 5,500.00 "
********************
*/
string str = @"3457,台,信息技术,"" 13,000,00 "",AMIN-1105-0537,A0411050537,笔记本,"" 12,345,333 ""
3715,台,信息技术,"" 5,500,00 "",AMIN-1108-0189,A0411080189,平板电脑,"" 5,500,00 """;
Regex reg = new Regex(@"(?<!""\s*(?:\d+,?)+),");
foreach (string s in str.Split(new string[] { "\r\n" }, StringSplitOptions.RemoveEmptyEntries))
{
foreach (string r in reg.Split(s))
Console.WriteLine(r);
Console.WriteLine(new string('*', 20));
}
/*
3457
台
信息技术
" 13,000,00 "
AMIN-1105-0537
A0411050537
笔记本
" 12,345,333 "
********************
3715
台
信息技术
" 5,500,00 "
AMIN-1108-0189
A0411080189
平板电脑
" 5,500,00 "
********************
*/
2.写算法:截取一位放缓冲;遇到"就标记true,再遇到",标记fales.遇到,检查标记,如果true,放入缓冲,否则就是一个数据保存之。