Bom dia prezados, estou precisando de uma ajuda novamente…
Estou percorrendo um arquivo e fazendo algumas modificações em determinadas linhas, abaixo segue um exemplo de linha do arquivo:
|C170|24|135||2,00000|UN|77,56|0,00|0|000|5102|10001|79,33|18,00|14,28|0,00|0,00|0,00||||0,00|0,00|0,00|01|79,33|1,6500|||1,31|01|79,33|7,6000|||6,03||
Pois bem, estou utilizando o metodo Split para salvar as posições da linha em um array mas quando consulto a ultima posição que seria a 37 ele me retorna um java.lang.ArrayIndexOutOfBoundsException, muito estranho pois se eu consultar a posição 36 ou anteriores funciona normalmente. Segue a baixo um pedaço do código.
public void modificaContas() {
try {
Arquivo novoArquivo = new Arquivo("C:\\Users\\justi\\Desktop\\EFD Canal\\EfdJS.txt");
novoArquivo.CriaArquivo();
InputStream is = new FileInputStream(this.arquivo);
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String efd = br.readLine(); // Primeira linha do arquivo do EFD;
while (efd != null) {
String[] linha = efd.split("[|]");
if ( linha[1].equals("C170")) {
if(linha[11].equals("1102")|| linha[11].equals("2102")|| linha[11].equals("1403")|| linha[11].equals("2403")){
System.out.println(linha[37]);
}
}
efd = br.readLine();
}
br.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Isso acontece pois quando os separadores estão em sequencia, como por exemplo ||
ou |||
o split considera como sendo somente um |
ignorando os valores vazios entre eles.
Terás que escrever um método próprio para quebrar sua linha.
Amigo, primeiramente muito obrigado,
Mas tenho uma observação, ele está ignorando somente a ultima posição, nos demais casos está funcionando corretamente.
está sendo ignorando apenas esses dois últimos ||, até a posição |6,03| ele trás normalmente.
Dessa forma não terás que se preocupar com valores vazios entre os |
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
class Exemplo {
public static void main(String args[]) {
try {
new Exemplo().executar();
} catch (Throwable t) {
t.printStackTrace();
}
}
void executar() throws IOException {
String linha = "|C170|24|135||2,00000|UN|77,56|0,00|0|000|5102|10001|79,33|18,00|14,28|0,00|0,00|0,00||||0,00|0,00|0,00|01|79,33|1,6500|||1,31|01|79,33|7,6000|||6,03||";
String separador = "|";
String[] colunas = separar(linha, separador);
for (int i = 0; i < colunas.length; i++) {
System.out.printf("%d: %s%n", i, colunas[i]);
}
}
// método para quebrar determinada linha usando o separador informado
String[] separar(String linha, String separador) {
List<String> valores = new ArrayList<>();
int comeco = 0;
int fim = linha.indexOf(separador, comeco);
while (comeco > -1 && comeco <= fim && fim > -1) {
String valor = linha.substring(comeco, fim);
valores.add(valor);
comeco = fim + 1;
fim = linha.indexOf(separador, comeco);
if (fim == -1) {
fim = linha.length();
}
}
return valores.toArray(new String[valores.size()]);
}
}
1 curtida