6

我正在尝试在 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

4 回答 4

6

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

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

2) 您可以使用 tokensBasedOn 将字符串拆分为多个片段:

myLine tokensBasedOn: $,
于 2012-03-12T16:31:55.900 回答
3

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

这将为您提供对所有 csv 文件的支持(例如,带有转义字符、引用字段等)

也可以看看这个帖子

于 2012-03-12T17:44:27.963 回答
2

有人将 NeoCSV 解析器从 Pharo 移植VisualWorks。它可能会解决您的问题。

于 2012-07-24T10:16:08.013 回答
1

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

| reader lines |
reader := CsvReader onFileNamed: aFilename.
[lines := OrderedCollection new.
[reader atEnd] whileFalse:
     [lines add: reader nextLine.]] 
     ensure: [reader close].
lines inspect.
于 2012-04-17T12:32:02.030 回答