Como, em smalltalk, ler e processar o conteúdo do arquivo CSV
-
12-12-2019 - |
Pergunta
Estou tentando ler e processar o conteúdo de um arquivo csv em smalltalk (visualworks), mas parece que estou tendo dificuldades para dividir a string em uma matriz, por favor.Abaixo está o código que consegui fazer funcionar.O que me falta é a parte que divide o conteúdo da variável myLine, que é uma string delimitada por vírgula, em uma matriz de strings, para ser adicionada a um TwoDList.Por favor, ajude com qualquer informação que você possa ter sobre como abordar isso, por favor.Obrigado
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.
Solução
1) Você também pode transformar uma string em um stream, para poder usar a mesma técnica usada para analisar o arquivo em linhas:
myLine := (inStream upTo: Character cr) readStream.
[ myLine atEnd ] whileFalse: [ | myCell |
myCell := myLine upTo: $,.
"Do whatever with the cell" ]
2) Você pode dividir uma string em pedaços usando tokensBasedOn:
myLine tokensBasedOn: $,
Outras dicas
Você pode querer verificar o Analisador CSVP projeto no squeaksource.Não deve ser difícil fazê-lo funcionar no Visualworks.
Isso lhe dará suporte para todos os arquivos CSV (por exemplo, com caracteres de escape, campos entre aspas, etc.)
Veja também esta postagem
Alguém portou o NeoCSV analisador de Pharo para VisualWorks.Isso pode resolver seu problema.
Provavelmente a maneira mais rápida é carregar o pacote "GHCsvImportExport".Então você pode fazer:
| reader lines |
reader := CsvReader onFileNamed: aFilename.
[lines := OrderedCollection new.
[reader atEnd] whileFalse:
[lines add: reader nextLine.]]
ensure: [reader close].
lines inspect.