tokenize
- и gettoken
тоже - из того, что я вижу, не примет повторные символы, такие как ,,
, как составной символ разбора. ,,
не является недопустимым как спецификация синтаксического анализа символов, но просто означает, что ,
и ,
являются приемлемыми символами синтаксического анализа. Повторение на практике игнорируется, так же как добавление слова «Меня зовут Жемчужина» после слова «Меня зовут Жемчужина» не добавляет информацию в разговор.
Резервное копирование: знайте, что без других инструкций (например, которые могут быть заданы командой syntax
) Stata будет анализировать строку в соответствии с пробелами, за исключением того, что двойные кавычки (или составные двойные кавычки) связывают сильнее, чем разделенные пробелы.
tokenize
- и gettoken
тоже - примут несколько символов разбора pchars , а справка по tokenize
дает пример с пробелом и знаком +
. (По моему опыту, гораздо реже использовать пробел и запятую ,
, когда синтаксис команды не совсем такой, какой syntax
анализирует полностью.)
Разница между пробелом и другими символами синтаксического анализа заключается в том, что пробелы отбрасываются, но другие символы синтаксического анализа не отбрасываются. Обоснование здесь заключается в том, что эти персонажи часто имеют значение, которое вы, возможно, захотите продвинуть вперед. Таким образом, при настройке синтаксиса для опции команды вы можете разрешить что-то вроде myoption(
varname [,
suboptions ] )
и так, наличие запятой и других вещей важно для последующего кода.
С составными символами, так что вы ищете, например, ,,
в качестве разделителей. Я думаю, что вам нужно будет циклически использовать substr()
или его эквивалент. На практике проще было бы обойти сначала замену составных символов каким-либо нейтральным одиночным символом, а затем применить tokenize
. Это может потребовать знания того, что этот нейтральный персонаж не должен происходить иначе. Поэтому я часто использую @
в качестве символьного заполнителя, потому что я знаю, что это не произойдет как часть имен переменных или скаляров и не будет частью имен функций или операторов.
Для чего стоит отметить, что при первом написании split
я разрешил составные символы в качестве разделителей. Насколько я помню, поводом для этого стал вопрос о Statalist, который касался данных по судебным делам с множественными вариациями на VS
(против), чтобы указать, какая сторона была какой. Этот пример выживает в помощь официальной команде.
От того, что является "серьезной" ошибкой, многое зависит от суждения. Я думаю, что программист просто обнаружит, попробовав, что составные символы не работают так, как хотелось бы с tokenize
в таких случаях, как ваш.