Вопрос

Я рассматриваю анализ строки с разделителями, что-то порядка

а, б, в

Но это очень простой пример, и анализ данных с разделителями может оказаться сложным;например

1, «Ваш простой алгоритм не работает», Верно

разнесет вашу наивную реализацию string.Split на биты.Есть ли что-нибудь, что я могу свободно использовать/украсть/скопировать и вставить, что предлагает относительно надежное решение для анализа текста с разделителями?.NET, плох.

Обновлять: Я решил пойти с TextFieldParser, который является частью множества полезных вещей VB.NET, спрятанных в Microsoft.VisualBasic.DLL.

Это было полезно?

Решение

Я использую это для чтения из файла

string filename = @textBox1.Text;
string[] fields;
string[] delimiter = new string[] {"|"};
using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
       new Microsoft.VisualBasic.FileIO.TextFieldParser(filename)) {
    parser.Delimiters = delimiter;
    parser.HasFieldsEnclosedInQuotes = false;

    while (!parser.EndOfData) {
        fields = parser.ReadFields();
        //Do what you need
    }
}

Я уверен, что кто-то здесь сможет преобразовать это для анализа строки, находящейся в памяти.

Другие советы

Очень обширную библиотеку можно найти здесь: FileHelpers

Я не знаю какой-либо структуры, но работает простой конечный автомат:

  • Состояние 1:Читайте каждый символ, пока не нажмете " или ,
    • В случае ":Перейти в состояние 2
    • В случае:Перейти в состояние 3
    • В случае конца файла:Перейти в состояние 4
  • Состояние 2:Читайте каждый символ, пока не нажмете "
    • В случае ":Перейти в состояние 1
    • В случае конца файла:Либо перейдите в состояние 4, либо сообщите об ошибке из-за незавершенной строки.
  • Состояние 3:Добавьте текущий буфер в выходной массив, переместите курсор вперед за и вернитесь в состояние 1.
  • Состояние 4:это конечное состояние, оно ничего не делает, кроме возврата выходного массива.

Такой как

var elements = new List<string>();
var current = new StringBuilder();
var p = 0;

while (p < internalLine.Length) {
    if (internalLine[p] == '"') {
        p++;

        while (internalLine[p] != '"') {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past last ',
        p += 2;
    }
    else {
        while ((p < internalLine.Length) && (internalLine[p] != ',')) {
            current.Append(internalLine[p]);
            p++;
        }

        // Skip past ,
        p++;
    }

    elements.Add(current.ToString());
    current.Length = 0;
}

Здесь есть несколько хороших ответов: Разделить строку, игнорируя цитируемые разделы

Возможно, вы захотите перефразировать свой вопрос на что-то более точное (например, Какой фрагмент кода или библиотеку я могу использовать для анализа данных CSV в .NET??).

Чтобы сделать бессовестный плагин, я некоторое время работал над библиотекой под названием фотоло (Загрузчик форматированного текста), который я использую для быстрого анализа больших объемов текста на основе разделителя, позиции или регулярного выражения.Для быстрой строки это излишне, но если вы работаете с журналами или большими объемами, это может быть именно то, что вам нужно.Он работает по модели управляющего файла, похожей на SQL*Loader (своего рода вдохновение для него).

Лучше поздно, чем никогда (добавьте полноту SO):

http://www.codeproject.com/KB/database/CsvReader.aspx

Это чертовы правила.

ГДж

Я думаю, что общая структура должна будет указывать между двумя вещами:1.Какие символы являются разделителями.2.При каком условии эти символы не учитываются (например, когда они заключены в кавычки).

Я думаю, что лучше писать собственную логику каждый раз, когда вам нужно сделать что-то подобное.

Самый простой способ - просто разделить строку на массив символов, найти определители строк и разделить символы.

Модульное тестирование должно быть относительно простым.

Вы можете обернуть его в метод расширения, аналогичный базовому методу .Spilt.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top