Как в 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: $,

вы, возможно, захотите, чтобы проверить CSVParser проект на squeaksource. Не должно быть сложно заставить его работать в Visualworks.

Это даст вам поддержку для всех файлов csv (e.g с экранированными символами, цитируемыми полями и т. д.)

см. Также этот пост


кто-то портировали на 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.