7

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

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

4

17 回答 17

17

String.Split 只是不会削减它,但 Regex.Split 可能 - 试试这个:

using System.Text.RegularExpressions;

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

其中“输入”是 csv 行。这将处理带引号的分隔符,并应为您返回一个表示行中每个字段的字符串数组。

于 2008-09-16T15:33:32.710 回答
8

如果您想要强大的 CSV 处理,请查看FileHelpers

于 2008-09-16T15:17:49.190 回答
2
string[] splitString = origString.Split(',');

(原始回答者未添加以下评论) 请记住,此答案解决了保证数据中没有逗号的特定情况。

于 2008-09-16T15:11:19.957 回答
2

尝试:

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

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

于 2008-09-16T15:24:07.663 回答
2

您可以查看使用 Microsoft.VisualBasic 程序集与

Microsoft.VisualBasic.FileIO.TextFieldParser

它处理带引号的 CSV(或任何分隔符)。我最近发现它很方便。

于 2008-09-16T16:04:59.220 回答
1

如果您想使用嵌入的逗号来说明带引号的元素,尤其是当它们与未带引号的字段混合时,没有一种简单的方法可以很好地做到这一点。

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

我的代码有几百行。

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

于 2008-09-16T15:18:19.877 回答
1

试试这个;

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;
            }
        }
    }

}
于 2008-09-16T16:13:10.697 回答
0
CsvString.split(',');
于 2008-09-16T15:10:58.070 回答
0

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

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

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

foreach (string line in lines)
{
    string[] items = line.Split({','}};
}
于 2008-09-16T15:12:33.370 回答
0
string test = "one,two,three";
string[] okNow = test.Split(',');
于 2008-09-16T15:13:33.587 回答
0
string s = "1,2,3,4,5";

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

请注意,Split() 采用要拆分的字符数组

于 2008-09-16T15:13:40.510 回答
0
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);
于 2008-09-16T15:13:49.670 回答
0
string[] splitStrings = myCsv.Split(",".ToCharArray());
于 2008-09-16T15:15:19.180 回答
0

一些 CSV 文件的值带有双引号和逗号。因此,有时您可以拆分此字符串文字:“,”

于 2008-09-16T15:26:39.013 回答
0

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

如果你想要一个你可以使用、免费或承诺的,这是我的,它也可以使用 IDataReader/Record。它还使用 DataTable 来定义/转换/强制列和 DbNull。

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

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

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

于 2008-09-16T15:30:48.427 回答
0

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

只需几个道具即可暴露分隔符/修剪空间/类型 ig,您只需要窃取代码即可。

于 2008-09-17T04:33:19.997 回答
0

我已经在标签上拆分了,所以这对我有用:

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();
}
于 2008-09-17T15:40:22.450 回答