سؤال

هل هناك طريقة سهلة لتحويل سلسلة من تنسيق CSV إلى سلسلة [] أو قائمة؟

يمكنني أن أضمن عدم وجود فواصل في البيانات.

هل كانت مفيدة؟

المحلول

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

(التعليق التالي لم تتم إضافته بواسطة المجيب الأصلي) يرجى أن تضع في اعتبارك أن هذه الإجابة تتناول الحالة المحددة حيث يتم ضمان عدم وجود فواصل في البيانات.

نصائح أخرى

لن يقوم String.Split بقص الأمر، لكن يمكن لـ Regex.Split - جرب هذا:

using System.Text.RegularExpressions;

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

حيث "الإدخال" هو سطر CSV.سيتعامل هذا مع المحددات المقتبسة، ويجب أن يعيد لك مجموعة من السلاسل التي تمثل كل حقل في السطر.

إذا كنت تريد معالجة قوية لملفات CSV، فقم بالخروج FileHelpers

يحاول:

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

مصدر: http://weblogs.asp.net/prieck/archive/2004/01/16/59457.aspx

يمكنك إلقاء نظرة على استخدام مجموعة Microsoft.VisualBasic مع

Microsoft.VisualBasic.FileIO.TextFieldParser

يتعامل مع ملف CSV (أو أي محدد) مع علامات الاقتباس.لقد وجدت أنه مفيد جدًا مؤخرًا.

لا توجد طريقة بسيطة للقيام بذلك بشكل جيد، إذا كنت تريد حساب العناصر المقتبسة بفواصل مضمنة، خاصة إذا كانت مختلطة مع حقول غير مقتبسة.

قد ترغب أيضًا في تحويل السطور إلى قاموس، مرتبطًا باسم العمود.

الكود الخاص بي للقيام بذلك يبلغ طوله عدة مئات من الأسطر.

أعتقد أن هناك بعض الأمثلة على الويب، ومشاريع مفتوحة المصدر، وما إلى ذلك.

جرب هذا؛

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

}
CsvString.split(',');

احصل على سلسلة [] من جميع الأسطر:

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

ثم قم بالمرور عبر هذه الأسطر وتقسيمها (هذا الخطأ عرضة لأنه لا يتحقق من وجود فواصل في الحقول المفصولة بعلامات اقتباس):

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

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

لاحظ أن Split() تأخذ مجموعة مصفوفة من الشخصيات للتقسيم عليها.

تحتوي بعض ملفات CSV على علامات اقتباس مزدوجة حول القيم بالإضافة إلى فاصلة.لذلك في بعض الأحيان يمكنك الانقسام على هذه السلسلة الحرفية:"،"

ملف Csv الذي يحتوي على حقول مقتبسة، ليس ملف Csv.يتم إخراج المزيد من الأشياء (Excel) بدون علامات الاقتباس بدلاً من علامات الاقتباس عند تحديد "Csv" في عملية حفظ باسم.

إذا كنت تريد واحدًا يمكنك استخدامه أو استخدامه مجانًا أو الالتزام به، فإليك برنامجي الذي يقوم أيضًا بـ IDataReader/Record.ويستخدم أيضًا DataTable لتحديد/تحويل/فرض الأعمدة وDbNull.

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

ولا يقوم بالاقتباسات..حتى الآن.لقد رميتها معًا منذ بضعة أيام لخدش الحكة.

نسيت الفاصلة المنقوطة:رابط جميل.شكرًا.كفيدوك:شكرًا على النصيحة لـ Microsoft.VisualBasic.FileIO.TextFieldParser.الذهاب إلى CsvDataReader الليلة.

http://github.com/claco/csvdatareader/ تم التحديث باستخدام TextFieldParser الذي اقترحه cfeduke.

على بعد عدد قليل من الدعائم بعيدًا عن كشف الفواصل/مسافات القطع/النوع، تحتاج فقط إلى رمز للسرقة.

لقد قمت بالفعل بالتقسيم على علامات التبويب، لذلك كان هذا هو الحل بالنسبة لي:

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();
}
string test = "one,two,three";
string[] okNow = test.Split(',');
separationChar[] = {';'}; // or '\t' ',' etc.
var strArray = strCSV.Split(separationChar);
string[] splitStrings = myCsv.Split(",".ToCharArray());
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top