如何在Smalltalk中读取和处理CSV文件的内容

时间:2012-03-12 14:03:20

标签: smalltalk visualworks

我试图在smalltalk(visualworks)中读取和处理csv文件的内容,但我似乎很难将字符串拆分成数组。下面是我能够开始工作的代码。我缺少的是将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 个答案:

答案 0 :(得分:6)

1)您也可以将字符串转换为流,这样您就可以使用相同的技术将文件解析为行:

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

2)您可以使用tokensBasedOn:

将字符串拆分为多个部分
myLine tokensBasedOn: $,

答案 1 :(得分:3)

您可能想查看squeaksource上的CSVParser项目。在Visualworks中使它工作应该不难。

这将支持所有csv文件(例如转义字符,引用字段等)

另见this post

答案 2 :(得分:2)

Someone ported从Pharo到VisualWorks的NeoCSV解析器。它可能会解决您的问题。

答案 3 :(得分:1)

可能最快的方法是加载包裹“GHCsvImportExport”。 然后你可以这样做:

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