Сведения о вопросе

Pytdev

19:31, 22nd August, 2020

Теги

Разбор строк с разделителями?

Просмотров: 439   Ответов: 9

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

а,б,c

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

1,"Ваш простой алгоритм, он терпит неудачу", правда

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

Update: я решил пойти с TextFieldParser, который является частью VB.NET's кучи лакомств, спрятанных в Microsoft.VisualBasic.DLL.



  Сведения об ответе

prince

14:38, 15th August, 2020

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

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

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


  Сведения об ответе

PHPH

05:39, 8th August, 2020

Я не знаю никаких рамок, но простая государственная машина работает:

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


  Сведения об ответе

JUST___

16:24, 25th August, 2020

Такие как

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


  Сведения об ответе

crush

17:19, 20th August, 2020

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


  Сведения об ответе

PIRLO

00:59, 19th August, 2020

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

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

А вот это уже совсем другие правила.

GJ


  Сведения об ответе

FAriza

23:05, 6th August, 2020

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

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


  Сведения об ответе

Chhiki

05:20, 16th August, 2020

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


  Сведения об ответе

ЯЯ__4

15:41, 14th August, 2020

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

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


  Сведения об ответе

9090

13:11, 18th August, 2020

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

Это должно быть относительно легко для юнит-теста.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться