关于c#:asp.net将CSV字符串转换为字符串[]

关于c#:asp.net将CSV字符串转换为字符串[]

asp.net Convert CSV string to string[]

有没有简单的方法可以将字符串从csv格式转换为字符串[]或列表?

我可以保证数据中没有逗号。


String.Split只是不打算剪切它,但是Regex.Split可以-尝试以下方法:

1
2
3
4
using System.Text.RegularExpressions;

string[] line;
line = Regex.Split( input,",(?=(?:[^"]*"[^"]*")*(?![^"]*"))");

其中"输入"是csv行。这将处理用引号引起来的定界符,并应给您返回代表该行中每个字段的字符串数组。


如果您需要强大的CSV处理功能,请查看FileHelpers


1
string[] splitString = origString.Split(',');

(以下评论未由原始回答者添加)
请记住,此答案是针对特定情况的,在这种情况下,保证数据中没有逗号。


尝试:

1
2
Regex rex = new Regex(",(?=([^"]*"[^"]*")*(?![^"]*"))");
string[] values = rex.Split( csvLine );

资料来源:http://weblogs.asp.net/prieck/archive/2004/01/16/59457.aspx


您可以看看将Microsoft.VisualBasic程序集与

1
Microsoft.VisualBasic.FileIO.TextFieldParser

它处理带引号的CSV(或任何定界符)。我最近发现它非常方便。


尝试这个;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
static IEnumerable<string> CsvParse(string input)
{
    // null strings return a one-element enumeration containing null.
    if (input == null)
    {
        yield return null;
        yield break;
    }

    // we will 'eat' bits of the string until it's gone.
    String remaining = input;
    while (remaining.Length > 0)
    {

        if (remaining.StartsWith(""")) // deal with quotes
        {
            remaining = remaining.Substring(1); // pass over the initial quote.

            // find the end quote.
            int endQuotePosition = remaining.IndexOf("
"");
            switch (endQuotePosition)
            {
                case -1:
                    // unclosed quote.
                    throw new ArgumentOutOfRangeException("Unclosed quote");
                case 0:
                    // the empty quote
                    yield return"";
                    remaining = remaining.Substring(2);
                    break;
                default:
                    string quote = remaining.Substring(0, endQuotePosition).Trim();
                    remaining = remaining.Substring(endQuotePosition + 1);
                    yield return quote;
                    break;
            }
        }
        else // deal with commas
        {
            int nextComma = remaining.IndexOf(",");
            switch (nextComma)
            {
                case -1:
                    // no more commas -- read to end
                    yield return remaining.Trim();
                    yield break;

                case 0:
                    // the empty cell
                    yield return"";
                    remaining = remaining.Substring(1);
                    break;

                default:
                    // get everything until next comma
                    string cell = remaining.Substring(0, nextComma).Trim();
                    remaining = remaining.Substring(nextComma + 1);
                    yield return cell;
                    break;
            }
        }
    }

}


如果要考虑带有嵌入式逗号的带引号的元素,尤其是如果它们与非带引号的字段混合使用,则没有简单的方法可以很好地做到这一点。

您可能还希望将这些行转换为字典,并以列名作为关键字。

我执行此操作的代码长数百行。

我认为网络上有一些示例,开源项目等等。


带有引号字段的Csv文件不是Csv文件。在另存为中选择" Csv"时,更多的东西(Excel)输出没有引号,而不是带有引号。

如果您想要一个可以使用,免费或致力于的工具,那么这里也是IDataReader / Record的工具。它还使用DataTable定义/转换/强制列和DbNull。

http://github.com/claco/csvdatareader/

它不做引号..呢。我只是几天前把它扔在一起挠痒痒。

被遗忘的分号:不错的链接。谢谢。
cfeduke:感谢您对Microsoft.VisualBasic.FileIO.TextFieldParser的提示。今晚进入CsvDataReader。


某些CSV文件在值的双引号和逗号之间。因此,有时您可以拆分此字符串文字:","


我已经在选项卡上分开了,所以这对我有用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static string CsvToTabDelimited(string line) {
    var ret = new StringBuilder(line.Length);
    bool inQuotes = false;
    for (int idx = 0; idx < line.Length; idx++) {
        if (line[idx] == '"') {
            inQuotes = !inQuotes;
        } else {
            if (line[idx] == ',') {
                ret.Append(inQuotes ? ',' : '\t');
            } else {
                ret.Append(line[idx]);
            }
        }
    }
    return ret.ToString();
}

1
CsvString.split(',');


1
string[] splitStrings = myCsv.Split(",".ToCharArray());

1
2
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);

1
2
3
string s ="1,2,3,4,5";

string myStrings[] = s.Split({','}};

请注意,Split()需要一个字符数组进行分割。


1
2
string test ="one,two,three";
string[] okNow = test.Split(',');

获取所有行的字符串[]:

1
string[] lines = System.IO.File.ReadAllLines("yourfile.csv");

然后循环遍历并拆分这些行(容易出错,因为它不检查引号分隔字段中的逗号):

1
2
3
4
foreach (string line in lines)
{
    string[] items = line.Split({','}};
}


http://github.com/claco/csvdatareader/使用cfeduke建议的TextFieldParser更新。

只需暴露一些分隔符/ trimspaces / type ig即可,您仅需要一些代码即可窃取。


推荐阅读

    数据库导出linux命令?

    数据库导出linux命令?,密码,数据,数据库,情况,地址,系统,工具,网上,名字,命

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux命令与数据流?

    linux命令与数据流?,工作,地址,系统,信息,命令,目录,标准,网络,管理,常用命

    linux恢复数据库命令?

    linux恢复数据库命令?,工具,系统,软件,数据,盘中,密码,命令,备份,数据库,文

    linux储存命令数据?

    linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

    linux储存命令数据?

    linux储存命令数据?,系统,工作,地址,信息,标准,命令,工具,实时,数据,分析,lin

    linux命令替换字符串?

    linux命令替换字符串?,字符串,文件,批量,首次,数据,命令,内容,方法,用字,结

    linux命令大全数据库?

    linux命令大全数据库?,服务,系统,平台,状态,软件,通用,环境,数据,神州,地址,

    linux上数据库的命令?

    linux上数据库的命令?,服务,系统,信息,地址,命令,密码,工具,管理,数据,单位,

    linux命令dm数据库?

    linux命令dm数据库?,地址,软件,时间,设备,名字,服务,位置,名称,公司,命令,lin

    linux拼接字符串命令?

    linux拼接字符串命令?,系统,工作,代码,工具,名称,信息,地址,时间,数据,命令,l

    linux使用命令的方法?

    linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,

    linux存储数据命令?

    linux存储数据命令?,系统,管理,数据,设备,情况,地址,工作,命令,服务,平台,Lin

    linux数据库查找命令?

    linux数据库查找命令?,位置,名称,状态,服务,软件,信息,系统,命令,名字,密码,

    添加字符串命令linux?

    添加字符串命令linux?,情况,名称,文件,位置,名字,地方,连续,信息,命令,内容,L

    linux数据库同步命令?

    linux数据库同步命令?,信息,系统,汽车,车辆,服务,工作,通信,一致,分析,数据,D

    linux磁盘列表命令?

    linux磁盘列表命令?,情况,管理,系统,单位,信息,数据,命令,磁盘,服务,时间,lin

    linux建立数据库命令?

    linux建立数据库命令?,软件,系统,工作,数据,密码,工具,数据库,一致,网络,服

    linux命令进数据库?

    linux命令进数据库?,地址,系统,名字,服务,密码,命令,读法,数据库,操作系统,

    linux清空表数据命令?

    linux清空表数据命令?,系统,数据,软件,名称,不了,命令,文件,电脑,地址,位置,L