2012-03-12 8 views
6

Sto tentando di leggere ed elaborare il contenuto di un file csv in smalltalk (visualworks), ma mi sembra che stia avendo qualche difficoltà a far dividere la stringa in un array per favore. Di seguito è riportato il codice che sono riuscito a lavorare. Quello che mi manca è il pezzo che divide il contenuto della variabile myLine, che è una stringa delimitata da virgole, in una matrice di stringhe, da aggiungere a TwoDList. Si prega di aiutare con tutte le informazioni che si possono avere su come affrontare questo per favore. GrazieCome, in smalltalk, leggere ed elaborare il contenuto del file 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. 

risposta

6

1) È possibile trasformare una stringa in un flusso così, in modo da poter utilizzare la stessa tecnica che hai utilizzato per analizzare il file in linee:

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

2) È possibile dividere un stringa in pezzi utilizzando tokensBasedOn:

myLine tokensBasedOn: $, 
+0

Grazie mille per la correzione. Inoltre, non ho tokenBasedOn: come un messaggio nella mia versione di VisualWorks. Ci sono modi per importare nuove librerie in VisualWorks da cui posso trarre vantaggio? – Kobojunkie

+0

Questo messaggio è stato nella base VW almeno fino a VW 7.0. Si noti che è plurale, token ... BasedOn: –

+0

il mio errore. Trovato! Grazie – Kobojunkie

3

Si potrebbe voler controllare il progetto CSVParser su squeaksource. Non dovrebbe essere difficile farlo funzionare in Visualworks.

Questo vi darà supporto per tutti i file CSV (per esempio con caratteri di escape, campi citati, ecc)

vedere anche this post

1

Probabilmente il modo più rapido sta caricando il "GHCsvImportExport" Parcel. allora si può fare:

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