2012-03-12 4 views
6

Je tente de lire et de traiter le contenu d'un fichier csv dans smalltalk (visualworks), mais il semble que j'ai du mal à faire se séparer la chaîne en un tableau s'il vous plaît. Ci-dessous est le code que j'ai pu travailler. Ce qui me manque est la pièce qui sépare le contenu de la variable myLine, qui est une chaîne délimitée par des virgules, en un tableau de chaînes, à ajouter à un TwoDList. S'il vous plaît aider avec toute information que vous pourriez avoir sur la façon d'aborder cela s'il vous plaît. MerciComment, dans smalltalk, lire et traiter le contenu du fichier 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. 

Répondre

6

1) Vous pouvez transformer une chaîne en un flux aussi bien, de sorte que vous pouvez utiliser la même technique que vous avez utilisé pour analyser le fichier en lignes:

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

2) Vous pouvez diviser un chaîne en morceaux à l'aide tokensBasedOn:

myLine tokensBasedOn: $, 
+0

Merci à tout un tas pour la correction. De plus, je n'ai pas tokenBasedOn: comme un message dans ma version de VisualWorks. Existe-t-il des moyens d'importer de nouvelles bibliothèques dans VisualWorks dont je peux tirer parti? – Kobojunkie

+0

Ce message a été dans la base VW au moins aussi loin que VW 7.0. Notez que c'est au pluriel, jetons ... BasedOn: –

+0

mon erreur. Trouvé! Merci – Kobojunkie

3

Vous pouvez consulter le projet CSVParser sur SqueakSource. Il ne devrait pas être difficile de le faire fonctionner dans Visualworks.

Cela vous donnera le soutien de tous les fichiers csv (avec les caractères échappées par exemple, les champs cités, etc.)

également voir this post

1

probablement le moyen le plus rapide est en train de charger la parcelle « GHCsvImportExport ». Ensuite, vous pouvez faire:

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