Obter número de colunas de um arquivo csv

5 respostas
D

Pessoal, preciso de ajuda

Eu tenho um arquivo csv com várias colunas que uso para gerar um outro arquivo de inserts para o SQL Server até aí tudo bem. A questão é que eu preciso comparar o número de colunas do arquivo csv com o número de colunas da tabela no sql server. No caso eu obtenho o número de colunas do sql server via arquivo .properties do java Porém não sei como obter o número de colunas do arquivo csv Já tentei matrizes, contador no tokenizer, e etc Estou precisando urgente disso D: segue o que eu estou tentando fazer
for (int lin=0;lin<1;lin++) {
				String result =linha;
			
                String colu = result;
			    colunas++;
				Arquivo arquivoscol = new Arquivo();
				StringReader srcol = new StringReader(colu);
				StreamTokenizer stcol = new StreamTokenizer(srcol);
				stcol.parseNumbers(); // necessário
				int tokenType;
				Integer tokenNumber=0;
				tokenType = stcol.nextToken();
				
				
				if (tokenType == StreamTokenizer.TT_NUMBER) {
					tokenNumber++;
					
				}
				tokenType = stcol.nextToken(); 
				tokenType = stcol.nextToken();
				if (tokenType == '\"'
						|| tokenType == StreamTokenizer.TT_WORD) {
					tokenNumber++;
					
				}
				tokenType = stcol.nextToken(); 
				tokenType = stcol.nextToken();
				if (tokenType == StreamTokenizer.TT_NUMBER) {
					tokenNumber++;
				
				}
				for(int col=0;col<4;col++)
				{
					colunas++;
				
				}
               
			}

5 Respostas

N

Posso estar totalmente errado, mas tentarei ajudar. Se você tiver um arquivo CSV com a estrutura similar ao exemplo abaixo, as colunas serão representadas na primeira linha e separadas por ;. No momento que você for ler essa primeira linha, você poderia simplesmente inserir essa linha num array respeitando o delimitador ;. Aí nesse exemplo abaixo teríamos um array com 2 elementos, que você obteria esse valor usando o lenght que retorna um int com o total de elementos do array.

Email;Nome
[email removido];Teste1
[email removido];Teste2
[email removido];Teste3
[email removido];Teste4
D

Po amigo, obrigado pela ajuda mas não é isso que eu quero
Eu quero varrer a primeira linha do arquivo para pegar o número de colunas, se eu fizer esse esquema de array, eu vou ter uma linha só obterei o número errado =/
e também, meu csv é separado por vírgulas, tendo vírgulas dentro de um campo descrição
Isso dificulta muito pois não é possivel dar o split e nem outras formas simples de divisão

N

DoninhaV8:
Po amigo, obrigado pela ajuda mas não é isso que eu quero
Eu quero varrer a primeira linha do arquivo para pegar o número de colunas, se eu fizer esse esquema de array, eu vou ter uma linha só obterei o número errado =/
e também, meu csv é separado por vírgulas, tendo vírgulas dentro de um campo descrição
Isso dificulta muito pois não é possivel dar o split e nem outras formas simples de divisão

Você tem como postar um exemplo da primeira linha? Outro dia fizemos algo parecido aqui no meu trabalho.

D

Seria algo nessa linha

10543,“Fertilizantes químicos, e nutrientes, de plantas”,500,“2000”

S

DoninhaV8:
Po amigo, obrigado pela ajuda mas não é isso que eu quero
Eu quero varrer a primeira linha do arquivo para pegar o número de colunas, se eu fizer esse esquema de array, eu vou ter uma linha só obterei o número errado =/
e também, meu csv é separado por vírgulas, tendo vírgulas dentro de um campo descrição
Isso dificulta muito pois não é possivel dar o split e nem outras formas simples de divisão

Não complique sua vida, use ponto-e-virgula para a separação ou | . Use um caracter que não está nos dados. E ai siga o que o colega já disse, basta ler a primeira linha e dar o parse. Pronto, o length do array vai dizer quantas colunas tem.

Se vc quer ir pelo caminho dificil faça o parser vc mesmo. pesquise a linha até achar uma virgula. Se achar um " sete um flag. Se a proxima virgula for encontrada e o flag estiver ativo, ignore e continue. No proximo " desative o flag. Ponha um count.
Isso vai dizer quantas colunas tem.

Outra opção é colocar o seu codigo de parsing em outra classe e usá-lo na primeira linha fora do loop. (tá meio estranho esse seu codigo)

Criado 7 de dezembro de 2012
Ultima resposta 7 de dez. de 2012
Respostas 5
Participantes 3