6

I am attempting to read and process the contents of a csv file in smalltalk(visualworks), but I seem to be having some hard time getting the string to split into an array please. Below is code I have been able to get working. What I am missing is the piece that splits the content of myLine variable, which is a comma-delimited string, into an array of strings, to be added to a TwoDList. Please help with any information you may have on how to approach this please. Thanks

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.
Kobojunkie
  • 6,375
  • 31
  • 109
  • 164

4 Answers4

6

1) You can turn a string into a stream as well, so you can use the same technique you used to parse the file into lines:

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

2) You can split a string into pieces using tokensBasedOn:

myLine tokensBasedOn: $,
  • Thanks a whole bunch for the correction. Also, I don't have tokenBasedOn: as a message in my version of VisualWorks. Are there ways of importing new libraries into VisualWorks that I can take advantage of? – Kobojunkie Mar 13 '12 at 12:11
  • That message has been in base VW at least as far as VW 7.0. Note that it's plural, tokens...BasedOn: – Martin Kobetic Mar 13 '12 at 20:37
3

You might want to check out the CSVParser project on squeaksource. It should not be hard to make it work in Visualworks.

This will give you support for all csv files (e.g with escaped chars, quoted fields,etc)

Also see this post

Community
  • 1
  • 1
Johan B
  • 2,461
  • 14
  • 16
2

Someone ported the NeoCSV parser from Pharo to VisualWorks. It might solve your problem.

Helene Bilbo
  • 1,142
  • 7
  • 20
1

Probably the quickest way is loading the Parcel "GHCsvImportExport". Then you can do:

| reader lines |
reader := CsvReader onFileNamed: aFilename.
[lines := OrderedCollection new.
[reader atEnd] whileFalse:
     [lines add: reader nextLine.]] 
     ensure: [reader close].
lines inspect.
Karsten
  • 2,772
  • 17
  • 22