2012-03-12 74 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.