Ir para conteúdo
Jean Freitas

capturar dados txt com arrays

Recommended Posts

Olá a todos, preciso de ajuda mais uma vez rsrssrrs

 

Estou capturando dados de um arquivo txt utilizando arrays, no arquivo txt as linhas estão da seguinte forma:

 

|I200|EX263EM2LT58DT17032014|17032014|637,78|N|
|I250|1.1.7.01.01.03.01|0|637,78|D|
|I250|2.1.3.02.03.02.01|0|637,78|C|
quando array[1] == "I250" && array[5] == "C ou "D" pego o valor e o número do array[2] para exportar para outro arquivo que vou gerar depois, até aí sem problemas, porém, tenho que criar o arquivo em colunas, por exemplo, coluna D e coluna C aí fiz o seguinte para o metodo gerar as colunas:
if (array[1] == "I250" && array[5] == "C")
{
string[] linhaanterior = linhas[i - 1].Split('|');
empresa.Debito = linhaanterior[2];
empresa.Credito = array[2];
empresa.ValorD = array[4];
empresa.ValorC = array[4];
empresa.HistD = array[8];
empresa.HistC = array[8];
criei a string linha linha anterior para poder pegar os dados do D quando estiver na linha C, só que nem sempre segue essa ordem D, C, D, C, D, C... aí está o problema as vezes o arquivo tem D, D, D, C, C, C ou vice-versa, então o sistema não gera com as informações corretas, tentei ser o mais claro possível, espero que alguém consiga me ajudar estou precisando resolver isso.
obrigado a todos

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vamos simplificar. Como está? E como deve ser?

Compartilhar este post


Link para o post
Compartilhar em outros sites

está assim:

 

if (array[1] == "I250" && array[5] == "C")
{
string[] linhaanterior = linhas[i - 1].Split('|');
empresa.Debito = linhaanterior[2];
empresa.Credito = array[2];
empresa.ValorD = array[4];
empresa.ValorC = array[4];
empresa.HistD = array[8];
empresa.HistC = array[8];
tem que ler todos os C´s e todos os D´s do registro I250, do jeito que está a linha anterior nem sempre é C ou D, por isso a dificuldade...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi direito, mas quando voce chegar na linha que tenha

|I250|1.1.7.01.01.03.01|0|637,78|D|
|I250|2.1.3.02.03.02.01|0|637,78|C|
você vai ler ela e pegar as letras que estao na ultima coluna?
while(array[1] == "1250")
{
if(array[5] == "D" || array[5] == "C")
}
string[] linhaanterior = linhas[i - 1].Split('|');
empresa.Debito = linhaanterior[2];
empresa.Credito = array[2];
empresa.ValorD = array[4];
empresa.ValorC = array[4];
empresa.HistD = array[8];
empresa.HistC = array[8];
}

Me Desculpe se não for isso que você queria. Ou se não der certo!..

Compartilhar este post


Link para o post
Compartilhar em outros sites

na verdade as letras que estão na ultima coluna são somente para diferenciar os dados, o que eu quero capturar está na segunda e penultima coluna, vou fazer umas modificações e tentar do jeito que falou porque nem sempre a linha anterior é C ou D, então a leitura ficará errada, mas vou testar... muito obrigado depois eu posto o resultado

Editado por Jean Freitas

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nuss, to confuso, pq pensei que vc queria pegar somente, as informações que em sua linha na ultima coluna possui-se as letras D ou C, e dai armazenar elas em outro bloco, só que utilizando sequencia de D,C,D,C, Se não resolveu tenta, explicar de uma outra forma, pois acho que não teve muita resposta pq pessoal ta lendo e ta confuso ainda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ainda não testei o que falou, é confuso mesmo, a situação é que tenho várias linhas dentro do registro I250, linhas com D e C mas nem sempre seguem essa ordem, eu criei o linhaanterior na tentativa de pegar os dados da linha anterior quando eu estivesse na linha que contem C mas não deu certo porque nem sempre linhaanterior é D, as vezes ela é C, ou as vezes é outra linha que nem tem o C ou D... é um pouco complicado mesmo, mas vou tentar o que me falou e depois posto, vou ter que reinstalar o visual studio por isso a demora... mas obrigado pelo seu interesse em ajudar... abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, para ser sincero, eu ainda não estou entendendo o que você quer fazer. Qual é o dado que você quer pegar? Quais são os dados que vem?

Compartilhar este post


Link para o post
Compartilhar em outros sites
é complicado para entender mesmo, mas vou tentar

conta debito valor

|I250|1.1.7.01.01.03.01|0|637,78|D|


conta credito valor

|I250|2.1.3.02.03.02.01|0|637,78|C|


preciso capturar conta debito, valor, conta credito, valor, esses dados estão cada um em uma linha, podemos identifica-los por I250, D ou C, fiz o sequinte:

para capturar os dados de D ou criei linhaanterior, aí quando eu estou lendo a linha que contém C eu pego os dados da linha anterior para gerar um novo arquivo, só que o problema é que nem sempre tenho essa ordem nas linhas, ou seja, as vezes em vez das linhas estarem nessa ordem D C D C... elas estão D D D C ou D C C C D e assim por diante, preciso fazer alguma coisa para que leia linha a linha ou então quando linha anterior contiver C não pega nada, só capture os dados quando linhaanterior contiver D no array e só leia dados existentes na linha que contém o I250 do array 1.

é isso não sei se ficou claro, se puderem ajudar eu agradeço...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deixa ver se eu entendi, Onde tiver a letra D.(Debito), C(Credito). você pega o numero da conta e armazena em outro bloco com a sequencia D.C.D.C,

|I250|1.1.7.01.01.03.01|0|637,78|D|
|I250|2.1.3.02.03.02.01|0|637,78|C|
|I250|1.1.7.01.01.03.01|0|637,78|D| como deve ficar
|I250|2.1.3.02.03.02.01|0|637,78|C|
|I250|1.1.7.01.01.03.01|0|637,78|D|
|I250|2.1.3.02.03.02.01|0|637,78|C|
ou seja tem que ficar nessa sequencia em outro bloco?
só que na maioria dos casos o bloco que efetua a leitura esta desorganizado.
ou seja encontra-se neste estado ai em baixo. é isso que você quer fazer?

|I250|1.1.7.01.01.03.01|0|637,78|A|
|I250|2.1.3.02.03.02.01|0|637,78|C|
|I250|2.1.3.02.03.02.01|0|637,78|B|
|I250|1.1.7.01.01.03.01|0|637,78|D| como esta
|I250|2.1.3.02.03.02.01|0|637,78|C|
|I250|1.1.7.01.01.03.01|0|637,78|D|

Compartilhar este post


Link para o post
Compartilhar em outros sites

é quase isso, só que o C e D significa credito e debito, então só teremos ele no arquivo, não temos A, B, C, D e não quero pegar todos os dados para outro bloco, quero apenas a coluna 2 (1.1.7.01.01.03.01|) e a coluna 4 (637,78), isso sim vou jogar em outro arquivo que tambem ficaria em colunas, se no arquivo que estou lendo não estivesse por linhas e sim por coluna daria certo, o problema é que tenho que ler por linhas e depois gerar outro arquivo por colunas, então ficaria assim leio do arquivo por linhas pegando todas as linhas do registro I250 (existem vários registros dentro desse arquivo de leitura) e diferenciando pelo D ou C, ou seja, se na linha conter D joga para a coluna debito no novo arquivo e se for C joga para coluna credito do novo arquivo, uma do lado da outra, é um layout a ser seguido que estou tentando criar para depois importar para outro sistema... cada linha do registro I250 possui um debito ou um credito que identificamos pelas letras D ou C e esses dados são capturados somente da linha que começa com I250, por isso tenho array criei a sequinte expressão:

if (array[1] == "I250" && array[5] == "C")
{
tudo está dentro da linha que possui I250 e aí basta separar C ou D, a dificuldade é quando D ou C estão fora de sequencia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Um entendi, vc vai pegar conta e o valor, verificar se pertence a Debito ou Credito, e organizar ele no bloco como coluna....

 

Debito credito

(1.1.7.01.01.03.01,637,78 ) | (2.1.3.02.03.02.01,637,78 )

isso no mesmo arquivo, entao quando eu achar D pego conta e valor insiro no Debito, quando achar o C Insiro no Credito correto?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lembrando, como meus conhecimentos, são poucos ate onde eu consegui raciocinar, necessário trabalhar com datatable. dai então fiz código que vai dar pra vc fazer isso, logico tem alguns bug, que voce vai ter que arrumar.. ate bom pra vc entender o código e emfim... então alguma parte do codigo que vc nao entender me fala... mais abaixo listo os bugs que vc vai ter que arrumar..

ler lerArquivo = new ler();


                                            //aqui caminho onde ta o arquivo a ser lido
            StreamReader ler = new StreamReader(@"C:\novapasta\teste.txt");

            string linha = null;

            // aqui crio uma tabela para receber os dados em coluna
            DataTable tabelaDadosBanco = new DataTable();

            //aqui crio cada coluna
            tabelaDadosBanco.Columns.Add("Debito");
            tabelaDadosBanco.Columns.Add("Credito");

            DataRow dados;


            // crio as linhas
            dados = tabelaDadosBanco.NewRow();

            while ((linha = ler.ReadLine()) != null)
            {
                string[] coluna = linha.Split('|');
                
                if ((coluna[1] == "1250") && (coluna[5] == "D"))
                {
                    lerArquivo.conta = coluna[2].ToString();
                    lerArquivo.valor = coluna[4].ToString();

                    //aqui concateno, acho que é a sim que se refere a isso
                 string juntar = "(" + lerArquivo.conta + ";" + lerArquivo.valor + ")|";

                   //aqui apos concaternar tudo passo o valor para debito
                    dados["Debito"] = juntar;
                }

                if ((coluna[1] == "1250") && (coluna[5] == "C"))
                {
                    lerArquivo.conta = coluna[2].ToString();
                    lerArquivo.valor = coluna[4].ToString();

                 string juntar = "(" + lerArquivo.conta + ";" + lerArquivo.valor + ");";

                    // aqui para credito
                    dados["Credito"] = juntar;

                }

                //aqui onde eu vou salvar o arquivo
                string arquivonovo = @"C:\novapasta\novoarquivo.txt";

                System.IO.TextWriter arquivo = System.IO.File.AppendText(arquivonovo);

                //aqui e onde eu escrevo no bloco
                arquivo.WriteLine(@""+ dados["Debito"] + dados["Credito"]);

                arquivo.Close();
            }
            
            MessageBox.Show("deu certo");

Abaixo como esta ficando

 

(2.1.3.02.03.02.01;637,78); < -- Problema
(2.1.3.02.03.02.01;637,78); < -- Problema
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
(1.1.7.01.01.03.01;637,78)|(2.1.3.02.03.02.01;637,78);
Porque aconteceu aquilo. Pelo fato de Credito ter Vindo Primeiro.. ai como pelo que sei, não tem como estipular coluna no bloco de notas, esse o problema que vai ter... daria pra vc fazer Excel, acho que como la e trabalhado com coluna daria certo.. mas não sei como funcionaria.. Qualquer coisa pergunta ai.. se souber respondo.. pq tbm estou aprendendo!...
Se não for isso Descupe.. mais foi que imaginei

Compartilhar este post


Link para o post
Compartilhar em outros sites

No arquivo a ser gerado não precisa separa por |, o espaço fica em branco mesmo. Não entendi os problemas das primeiras linhas geradas, desculpe a ignorância e muito obrigado pela ajuda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, porque você não tenta organizar o array primeiro.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ao invés de ficar um

 

C

C

D

C

D

D

 

Por que antes de separar, você não organiza tudo em D, C, D, C, D, C?

Compartilhar este post


Link para o post
Compartilhar em outros sites

até aí tudo bem, mas como faria isso... desculpe sou iniciante rsrsr, vou mandar o código para ver se conseguem ajudar e entender melhor... obrigado

 

namespace GeraConta
{
public partial class Frm_Gerador : Form
{
public Frm_Gerador()
{
InitializeComponent();
}
public void GerarArquivo(string arquivo) //metodo que gera o arquivo
{
Teste teste = new Teste();
DirectoryInfo dir = new DirectoryInfo("c:\\pastateste");
string path1 = dir.FullName + "\\capturodaqui.txt";
string textocompleto = File.ReadAllText(path1);
string[] linhas = File.ReadAllLines(path1);
int i = 0;
int contador = 1;
foreach (string coluna in linhas)
{
string id = contador.ToString("D5");
string[] array = coluna.Split('|');
if (array[1] == "I200" || array[1] == "I250")
{
if (array[1] == "I200")
{
teste.Dia = array[3].Substring(0, 2).Trim();
teste.Mes = array[3].Substring(2, 2).Trim();
teste.Ano = array[3].Substring(4, 4).Trim();
}
if (array[5] == "D")
{
teste.Contadebito = array[2];
teste.Valordebito = array[4];
teste.Historicodebito = array[8];
}
if (array[5] == "C")
{
teste.Contacredito = array[2];
teste.Valorcredito = array[4];
teste.Historicocredito = array[8];
}
DirectoryInfo di = new DirectoryInfo("c:\\pastateste");
string path = di.FullName + "\\" + arquivo;
StreamWriter sw = File.AppendText(path);
string novacoluna = "";
novacoluna += "LC1".PadRight(3); //tipo
novacoluna += id.PadRight(5); //ordem
novacoluna += "1".PadLeft(4); //modo
novacoluna += teste.Dia.PadRight(2);
novacoluna += teste.Mes.PadRight(2);
novacoluna += teste.Ano.PadRight(4);
novacoluna += "35000CPR".PadLeft(18); //lote
novacoluna += "002".PadLeft(30); //conta1
novacoluna += teste.Contadebito.PadRight(19);
novacoluna += teste.Contacredito.PadRight(24);
novacoluna += teste.Valordebito.PadLeft(20); //conta2
novacoluna += teste.Historicodebito.ToUpper().PadRight(240);
novacoluna += teste.Contacredito.PadRight(19);
novacoluna += teste.Valorcredito.PadLeft(19).Replace(",", "."); //conta3
novacoluna += teste.Historicocredito.ToUpper().PadRight(240);
sw.WriteLine(novacoluna);
contador++;
sw.Close();
}
i++;
}
}
private void btnLer_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
System.IO.StreamReader sr = new
System.IO.StreamReader(openFileDialog1.FileName);
string textocompleto = File.ReadAllText(openFileDialog1.FileName);
List<Teste> listateste = new List<Teste>();
string[] linhas = File.ReadAllLines(openFileDialog1.FileName);
int i = 0;
foreach (string coluna in linhas)
{
string[] array = coluna.Split('|');
if (array[1] == "I200")
{
Teste teste = new Teste();
teste.Dia = array[3].Substring(0, 2).Trim();
teste.Mes = array[3].Substring(2, 2).Trim();
teste.Ano = array[3].Substring(4, 4).Trim();
listateste.Add(teste);
}
if (array[1] == "I250")
{
if (array[5] == "D" || array[5] == "C")
{
Teste teste = new Teste();
string[] linhaanterior = linhas[i - 1].Split('|');
teste.Contadebito = linhaanterior[2];
teste.Contacredito = array[2];
teste.Valorcredito = array[4];
teste.Valordebito = linhaanterior[4];
teste.Historicocredito = array[8];
teste.Historicodebito = linhaanterior[8];
listateste.Add(teste);
}
}
//if (array[1] == "I250" && array[5] == "D")
//{
// Teste teste = new Teste();
// teste.Contadebito = array[2];
// teste.Valordebito = array[4];
// teste.Historicodebito = array[8];
// listateste.Add(teste);
//}
//if (array[1] == "I250" && array[5] == "C")
//{
// Teste teste = new Teste();
// teste.Contacredito = array[2];
// teste.Valorcredito = array[4];
// teste.Historicocredito = array[8];
// listateste.Add(teste);
//}
i++;
}
gridDados.DataSource = listateste;
sr.Close();
}
}
private void btnGera_Click(object sender, EventArgs e)
{
GerarArquivo("arquivogerado.txt");
}
grato a todos

agora segue trecho do txt que capturo os dados:

 

|I200|EX263EM2LT59DT01032014|01032014|234,92|N|
|I250|1.9.1.01.01.01.04|0|143,00|D|NFC0020000185664|2|DEVOL. VENDA NF: 1234||
|I250|3.1.1.01.03.08.01|400|143,00|C|NFC0020000185664|2|NF DEV. 1234||
|I250|1.1.5.01.01.07.01|0|91,92|D|NFC0020000185664|2|NF DEV. 1234||
|I250|3.1.1.02.03.18.01|400|91,92|C|NFC0020000185664|2|NF DEV. 1234|| //observe que aqui sai da ordem
|I200|EX263EM2LT59DT05032014|05032014|107403,03|N|
|I250|2.1.1.01.01.01.01|0|1385,03|C|NFC0020000185665|2|NF: 4567.|| //linhanterior não é D
|I250|1.1.5.01.01.07.01|0|1381,67|D|NFC0020000185665|2|NF: 4567||
|I250|2.1.3.02.01.02.03|0|0,60|D|NFC0020000185665|2|NF: 4567||
|I250|2.1.3.02.01.02.04|0|2,76|D|NFC0020000185665|2|NF: 4567||
|I250|2.1.1.01.01.01.01|0|34,29|C|NFC0020000185666|2|NF: 4567||
|I250|1.1.5.01.01.07.01|0|24,95|D|NFC0020000185666|2|NF: 4567||

se eu conseguir fazer o linhaanterior não ler a linha que começa com o array I200, ou seja, quando linhaanterior contiver I200 pule para a proxima ou leia apenas os blocos I250

 

obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.