Jump to content

Ler partes de ficheiro


Recommended Posts

Posted (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 by c.ms
Posted

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]));
   }
}
  • Vote 1
Posted (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 by c.ms
Posted

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?

Posted

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.

Posted
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

Posted (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 by bioshock

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.