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.
Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top