Как в smalltalk читать и обрабатывать содержимое CSV-файла
Я пытаюсь прочитать и обработать содержимое csv-файла в smalltalk (visualworks), но мне кажется, что мне трудно заставить строку разбиться на массив, пожалуйста. Ниже приведен код, который я смог получить. Мне не хватает фрагмента, который разбивает содержимое переменной myLine, которая является строкой с разделителями-запятыми, на массив строк, которые будут добавлены в список TwoDList. Пожалуйста, помогите с любой информацией, вы можете иметь о том, как подойти к этому, пожалуйста. Спасибо
SpreadsheetReadCSV: inFilename
|inStream myLine rcnt|
rcnt := 0.
" scan thru the text lines, using a traditional i/o loop "
inStream := (inFilename asFilename) readStream .
[ inStream atEnd ] whileFalse: [
rcnt := rcnt + 1.
myLine := inStream upTo: Character cr.
"Process the commadelimited string here"
].
inStream inspect.
inStream close.
^myLine.
4 ответов
1) вы также можете превратить строку в поток, поэтому вы можете использовать тот же метод, который вы использовали для разбора файла на строки:
myLine := (inStream upTo: Character cr) readStream.
[ myLine atEnd ] whileFalse: [ | myCell |
myCell := myLine upTo: $,.
"Do whatever with the cell" ]
2) Вы можете разделить строку на части, используя tokensBasedOn:
myLine tokensBasedOn: $,
кто-то портировали на NeoCSV парсер от Pharo до VisualWorks. Это может решить вашу проблему.
вероятно, самый быстрый способ-загрузить посылку "GHCsvImportExport". Тогда вы можете сделать:
| reader lines |
reader := CsvReader onFileNamed: aFilename.
[lines := OrderedCollection new.
[reader atEnd] whileFalse:
[lines add: reader nextLine.]]
ensure: [reader close].
lines inspect.