c.ms Posted February 24, 2014 at 06:49 PM Report #546514 Posted February 24, 2014 at 06:49 PM (edited) Olá a todos, estou a realizar um trabalho em c# e preciso de ler os valores de um ficheiro .txt em separado, isto é, o ficheiro tem uma estrutura semelhante a esta: 20 3 21 3 22 1 ... em que os espaços são um "TAB". Eu preciso de ler os valores das colunas para um array, por exemplo, ficando neste caso [20 21 22] [3 3 1] A minha dificuldade está em fazer esta leitura separada, penso que será com o Split, mas ainda não consegui implementar... Agradecia uma ajuda, se possível. Obrigado 🙂 Edited February 24, 2014 at 06:51 PM by c.ms
nelsonr Posted February 24, 2014 at 10:04 PM Report #546537 Posted February 24, 2014 at 10:04 PM Poderá ser algo assim: // using(StreamReader sr=new StreamReader("ficheiro.txt")) { List<int> listaColuna0 = new List<int>(); List<int> listaColuna1 = new List<int>(); string line; while((line=sr.ReadLine())!=null) { string[] colunas = line.Split('\t'); if (colunas.Length > 0) listaColuna0.Add(Convert.ToInt32(colunas[0])); if (colunas.Length > 1) listaColuna1.Add(Convert.ToInt32(colunas[1])); } } 1 Report
c.ms Posted February 25, 2014 at 08:04 AM Author Report #546556 Posted February 25, 2014 at 08:04 AM (edited) Muito obrigado, era mesmo isso 👍 Já agora sabes como posso fazer para ir lendo um ficheiro, quando encontrar um determinado valor(20 por exemplo) escrever uma nova linha no ficheiro, depois da linha atual? Obrigado Edited February 25, 2014 at 08:44 AM by c.ms
c.ms Posted March 3, 2014 at 04:32 PM Author Report #547377 Posted March 3, 2014 at 04:32 PM Muito obrigado, era mesmo isso 👍 Já agora sabes como posso fazer para ir lendo um ficheiro, quando encontrar um determinado valor(20 por exemplo) escrever uma nova linha no ficheiro, depois da linha atual? Obrigado Então pessoal, ninguém consegue dar uma mãozinha?
bioshock Posted March 3, 2014 at 05:18 PM Report #547394 Posted March 3, 2014 at 05:18 PM Podes sempre ler o que está dentro do ficheiro para uma Stringbuilder, fazer o que tens a fazer nela e depois depositares novamente no ficheiro. Caso não gostes da solução, detectas o índice de onde apanhaste o valor 20 e escreves lá uma nova linha.
c.ms Posted March 3, 2014 at 05:57 PM Author Report #547414 Posted March 3, 2014 at 05:57 PM Obrigado, vou tentar implementar... Já tentei mas tive problemas com a abertura do ficheiro para leitura e posteriormente escrita...
c.ms Posted March 5, 2014 at 07:06 PM Author Report #547669 Posted March 5, 2014 at 07:06 PM bool InserirInicio = false; bool InserirFim = false; int InserirRoda = 88; int InserirQuantidade = 14; int indice = -1; StreamReader leitor = new StreamReader(@"C:\Users\Cr\Desktop\TestesEtc\AdicionarRodas\teste_adicionar\RodasQuant.txt"); int numerolinhas = File.ReadAllLines(@"C:\Users\Cr\Desktop\TestesEtc\AdicionarRodas\teste_adicionar\RodasQuant.txt").Length; //Listas para guardar o estado actual do ficheiro List<int> ListaAntigaRodas = new List<int>(numerolinhas); List<int> ListaAntigaQuant = new List<int>(numerolinhas); //Lista para guardar o novo ficheiro int[] ListaNovaRodas = new int[numerolinhas + 1]; int[] ListaNovaQuant = new int[numerolinhas + 1]; string line; while ((line = leitor.ReadLine()) != null) { string[] colunas = line.Split('\t'); if (colunas.Length > 0) ListaAntigaRodas.Add(Convert.ToInt32(colunas[0])); if (colunas.Length > 1) ListaAntigaQuant.Add(Convert.ToInt32(colunas[1])); } int minimo = ListaAntigaRodas[0]; int maximo = ListaAntigaRodas[numerolinhas - 1]; Console.WriteLine(minimo + " " + maximo); leitor.Close(); //Procura o indice onde tem de por a nova roda! if (InserirRoda >= minimo && InserirRoda <= maximo) { for (int i = 0; i < numerolinhas; i++) //RETIFICAR AQUI! Inserir por exemplo, roda 15 e depois 14 não funciona; esta a assumir que existem todas as rodas entre o minimo e maximo { if ((ListaAntigaRodas[i] == InserirRoda) == true) indice = i; else // se não exister nenhuma roda do tamanho da q vai ser inserida { //Procurar indice anterior e seguinte à roda a inserir if (ListaAntigaRodas[i] < InserirRoda && ListaAntigaRodas[i + 1] > InserirRoda) { indice = i + 1; // a partir deste indice tem de se andar com toda a lista 1 casa para a frente //Como fazer depois?!?! } } } } else if (InserirRoda < minimo) { indice = 0; InserirInicio = true; } else { indice = numerolinhas + 1; InserirFim = true; } //Insere no inicio caso a roda nao exista e seja < minimo if (InserirInicio == true) { ListaNovaQuant[0] = InserirQuantidade; ListaNovaRodas[0] = InserirRoda; } else if (InserirFim == true) //Insere no fim caso a roda exista e seja > maximo { ListaNovaQuant[numerolinhas] = InserirQuantidade; ListaNovaRodas[numerolinhas] = InserirRoda; } for (int i = 0; i < numerolinhas; i++) { if (InserirInicio == true) { ListaNovaRodas[i + 1] = ListaAntigaRodas[i]; ListaNovaQuant[i + 1] = ListaAntigaQuant[i]; }else if (InserirFim == true && i != numerolinhas + 1) { ListaNovaRodas[i] = ListaAntigaRodas[i]; ListaNovaQuant[i] = ListaAntigaQuant[i]; } else { if (i == indice) ListaNovaQuant[i] = (ListaAntigaQuant[i] + InserirQuantidade); else ListaNovaQuant[i] = ListaAntigaQuant[i]; } } //Até aqui OK, agora fazer escrita para ficheiro StreamWriter Escritor = new StreamWriter(@"C:\Users\Cr\Desktop\TestesEtc\AdicionarRodas\teste_adicionar\RodasQuant.txt"); if (InserirInicio == true || InserirFim == true) { for (int i = 0; i < numerolinhas + 1; i++) { Escritor.WriteLine(Convert.ToString(ListaNovaRodas[i]) + "\t" + Convert.ToString(ListaNovaQuant[i])); Console.WriteLine("Escrevi: " + Convert.ToString(ListaNovaRodas[i]) + "\t" + Convert.ToString(ListaNovaQuant[i])); } }else for (int i = 0; i < numerolinhas; i++) { Escritor.WriteLine(Convert.ToString(ListaAntigaRodas[i]) + "\t" + Convert.ToString(ListaNovaQuant[i])); Console.WriteLine("Escrevi: " + Convert.ToString(ListaAntigaRodas[i]) + "\t" + Convert.ToString(ListaNovaQuant[i])); } Escritor.Close(); Console.Read(); Fiz esta implementação, no entanto não estou a conseguir fazer o seguinte: Tendo 20 3 21 2 .... Ao inserir, por exemplo, 15, 1 fico com 15 1 20 1 21 2 Mas se agora quiser inserir o 14 não vai funcionar, pois o programa está a "assumir" que os valores estão sequenciais, o que pode não acontecer.. Alguém pode dar uma dica? Obrigado
bioshock Posted March 5, 2014 at 08:00 PM Report #547672 Posted March 5, 2014 at 08:00 PM (edited) Devias de ler o post que fazes 2 ou 3 vezes antes de o inserires no fórum. Ao inserir, por exemplo, 15, 1 fico com 15 1 20 1 21 2 Mas se agora quiser inserir o 14 não vai funcionar, Não dizes como é que inseres, onde inseres e o que é que não funciona. Olhando para o teu código, nestas duas linhas bates logo de frente. int minimo = ListaAntigaRodas[0]; int maximo = ListaAntigaRodas[numerolinhas - 1]; Se eu colocar a seguinte lista: 55 1 21 2 13 2 15 1 O código vai dizer: minimo = 55; maximo = 15; Para resolveres o problema é simples int minimo = (from numbers in ListaAntigaRodas select numbers).Min(); int maximo = (from numbers in ListaAntigaRodas select numbers).Max(); Também de referir que isto não faz nada. if (colunas.Length > 0) ListaAntigaRodas.Add(Convert.ToInt32(colunas[0])); if (colunas.Length > 1) ListaAntigaQuant.Add(Convert.ToInt32(colunas[1])); Se queres verificar se as duas "casas" estão preenchidas: if(colunas[0].Length > 0 && colunas[1].Length > 0){ ListaAntigaRodas.Add(Convert.ToInt32(colunas[0])); ListaAntigaQuant.Add(Convert.ToInt32(colunas[1])); } Edited March 5, 2014 at 08:01 PM by bioshock
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now