Разбор строк с разделителями?[закрыто]
-
08-06-2019 - |
Вопрос
Я рассматриваю анализ строки с разделителями, что-то порядка
а, б, в
Но это очень простой пример, и анализ данных с разделителями может оказаться сложным;например
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.