Как в smalltalk читать и обрабатывать содержимое файла CSV - PullRequest
6 голосов
/ 12 марта 2012

Я пытаюсь прочитать и обработать содержимое 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 ]

6 голосов
/ 12 марта 2012

1) Вы также можете превратить строку в поток, чтобы вы могли использовать ту же технику, что и для разбора файла на строки:

myLine := (inStream upTo: Character cr) readStream.
[ myLine atEnd ] whileFalse: [ | myCell |
  myCell := myLine upTo: $,.
  "Do whatever with the cell" ]

2) Вы можете разбить строку на частииспользуя tokensBasedOn:

myLine tokensBasedOn: $,
3 голосов
/ 12 марта 2012

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

Это даст вам поддержку всех файлов CSV (например, с экранированными символами, полями в кавычках и т. Д.)

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

2 голосов
/ 24 июля 2012

Кто-то перенес парсер NeoCSV из Pharo в VisualWorks.Это может решить вашу проблему.

1 голос
/ 17 апреля 2012

Вероятно, самый быстрый способ - загрузить посылку "GHCsvImportExport".Тогда вы можете сделать:

| reader lines |
reader := CsvReader onFileNamed: aFilename.
[lines := OrderedCollection new.
[reader atEnd] whileFalse:
     [lines add: reader nextLine.]] 
     ensure: [reader close].
lines inspect.
...