2010-12-16 3 views
3

Когда задан список значений, разделенных запятыми, таких как 3, asdf, *#, 1212.3, я хотел бы извлечь каждое из этих значений, не включая запятую, поэтому у меня будет список значений, например [3, "asdf", "*#", 1212.3] (а не как текстовое представление как это, но как массив «хитов»). Как мне это сделать?Извлечение значений из списков, разделенных запятыми

+1

На каком языке программирования? – Asaph 2010-12-16 04:42:28

+1

Язык программирования D. – 2010-12-16 04:43:04

ответ

2

Прежде всего, если вы имеете дело с файлами CSV, не используйте регулярное выражение или собственный синтаксический анализатор. В основном, когда вы думаете, что все просто, они действительно не являются, Stop Rolling Your Own CSV Parser.

Далее вы говорите, что хотите иметь массив ([3, "asdf", "* #", 1212.3]). Это похоже на смешивание типов и не может быть сделано на статическом языке. И в конечном итоге очень неэффективно даже с использованием std.variant. Для каждого проанализированного значения вы быть_наст код:

try { 
    auto data = to!double(parsedValue); 
    auto data2 = to!int(data); 
    if(data == data2) 
     returnThis = Variant(data2); 
    else 
     returnThis = Variant(data); 
} catch(ConvException ce) { } 

Теперь, если данные истинно разделена некоторые определенный набор символов, а не разбиваются на запись с новой строкой, то вы можете использовать раскол (» , ") из std.algorithm. В противном случае используйте парсер CSV. Если вы не хотите следовать стандартным оберткам парсера, чтобы данные были вами. В вашем примере у вас есть пробелы, которые не должны игнорироваться в формате CSV, поэтому вызовите strip() на выходе.

В the article I linked упоминается, что обычно происходит то, что люди будут писать парсер в его простейшей форме и не обрабатывать более сложные случаи. Поэтому, когда вы ищете парсер CSV, вы найдете много, которые просто не режут его. Это написание собственного парсера, который я говорю, прекрасно обрабатывает все допустимые файлы CSV.

К счастью, вам не нужно писать свои собственные, так как я изящно сделал CSV Parser for D. Проверка ошибок в настоящее время не выполняется, я не знаю, как лучше всего сообщить о таких проблемах, что синтаксический анализ может быть исправлен и продолжен. Примеры использования найдены в блоках unittest. Вы также можете анализировать структуру:

struct MyData { 
    int a; 
    string b; 
    string c; 
    double d 
} 

foreach(data; csv.csv!MyData(str)) // I think I'll need to change the module/function name 
    //... 
1

в perl вы могли бы сделать что-то вроде:

@anArray = split(',', "A,B,C,D,E,F,G"); 
+0

Что делать, если некоторые поля CSV имеют запятую? например. `` my, first, field "," my, second, field "," my, third, field ", который полностью легален в CSV. – Asaph 2010-12-16 04:49:25

+0

В любом случае OP использует язык программирования D. Поэтому ответ perl не имеет значения. – Asaph 2010-12-16 04:50:01

0

(?:,|\s+)?([^ ,]+) следует делать. Он пропускает запятую или пробел, затем выбирает что угодно, кроме запятой или пробелом. Измените вкус.

Смежные вопросы