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

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

а, б, в

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

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

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

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

13.08.2008 18:46:44
9 ОТВЕТОВ
РЕШЕНИЕ

Я использую это, чтобы прочитать из файла

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

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

4
7.02.2016 18:31:10
Возвращаясь к этому ответу, я все еще думаю, что он лучший. Я попробовал FileHelpers и пришел к выводу, что они меня пугают. Я не доверяю структуре, которая опирается на порядок, в котором поля определены для типа.
user1228 21.12.2009 21:07:53

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

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

0
13.08.2008 18:49:40

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

  • Состояние 1: Читайте каждый символ, пока не нажмете "или
    • В случае ": перейти к состоянию 2
    • В случае a: перейти в состояние 3
    • В случае окончания файла: перейти в состояние 4
  • Состояние 2: Читайте каждый символ, пока не нажмете "
    • В случае ": перейти к состоянию 1
    • В случае конца файла: либо переместиться в состояние 4, либо сообщить об ошибке из-за неопределенной строки
  • Состояние 3: добавление текущего буфера к выходному массиву, перемещение курсора вперед за и обратно в состояние 1.
  • Состояние 4: это конечное состояние, ничего не делает, кроме возврата выходного массива.
2
26.02.2009 15:40:14
Строки CSV могут содержать символы новой строки в текстовых кавычках, поэтому вы не можете сигнализировать об ошибке, находясь в состоянии 2, если конец строки.
cjk 26.02.2009 14:24:03
Это действительно так, я всегда забываю о страшном символе \ n, который испортит большинство парсеров CSV. Уточнено.
Michael Stum♦ 26.02.2009 15:38:34

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

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

1
23.05.2017 12:08:38

Такие как

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;
}
2
10.01.2014 16:35:52
@ C1pher, пожалуйста, не делайте стилистических изменений, таких как Java против C # / Pascal.
StuartLC 10.01.2014 16:37:36
Согласовано. Я пытался отклонить это изменение, но оно уже было одобрено.
Andy West 10.01.2014 16:44:13
К чему я хотел бы добавить, мы не занимаемся ни K & R, ни разработкой ядра Linux. FFS, ребята.
Stu 10.01.2014 20:11:00

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

Это должно быть относительно легко для модульного тестирования.

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

0
13.08.2008 18:57:16
Строка по своей сути является массивом символов, вам не нужно делать никаких преобразований
cjk 26.02.2009 14:25:00

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

1
13.08.2008 19:54:40

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

2
5.11.2008 17:04:01
Я попробовал FileHelpers с тех пор, как задал этот вопрос, и мне действительно не нравятся парсеры с разделителями.
user1228 21.12.2009 21:08:44

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

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

Это одно из правил.

GJ

1
30.06.2011 11:02:55