2012-03-12 75 views
6

我正在尝试在Smalltalk(visualworks)中读取和处理一个csv文件的内容,但我好像很难让字符串拆分成一个阵列请。以下是我已经能够工作的代码。我所缺少的是将myLine变量(逗号分隔的字符串)的内容拆分为一个字符串数组,将其添加到TwoDList中。请帮助您提供有关如何处理此问题的任何信息。由于如何在Smalltalk中读取和处理CSV文件的内容

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. 

回答

6

1)你可以把字符串转换成流为好,这样你就可以使用相同的技术,你用来解析文件到行:

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

2)您可以拆分字符串成片使用tokensBasedOn:

myLine tokensBasedOn: $, 
+0

感谢一大堆的纠正。另外,我没有tokenBasedOn:作为VisualWorks版本中的消息。是否有将新库导入VisualWorks的方法,我可以利用它? – Kobojunkie 2012-03-13 12:11:36

+0

该消息在VW基础上至少达到VW 7.0。请注意,它是复数,令牌... BasedOn: – 2012-03-13 20:37:32

+0

我的错误。找到了!谢谢 – Kobojunkie 2012-03-13 22:04:49

3

您可能要检查出squeaksource的CSVParser项目。在Visualworks中工作并不困难。

这会给你的所有CSV文件支持(例如带的转义字符,引号的字段等等)

另见this post

1

大概是最快的方法是装载包裹“GHCsvImportExport”。 然后,你可以这样做:

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