C # работа с текстовыми файлами

#c# #visual-studio #console-application #text-files

#c# #visual-studio #консоль-приложение #текстовые файлы

Вопрос:

Я работал над этим часами, я дошел до последней части того, над чем я работаю. Мне нужно выяснить, как ограничить цикл для получения значений из определенного rang в текстовых строках. Например, строки 1-5, затем 6-10 и т.д.

 TextReader tr = new StreamReader("values.txt");
        for (int i = 0; i <= 5; i  )
        {
            for (int a = 0; a <= 5; a  )
            {
                line = tr.ReadLine();
                **while ((line = tr.ReadLine()) != null)**
                    for (a = 0; a <= 5; a  ){
                        ln = tr.ReadLine();
                        if (ln != null){
                            value = int.Parse(ln);
                            if (value > max)
                                max = value;
                            if (value < min)
                                min = value;}
                    }
                Console.WriteLine(tr.ReadLine());
                if (i % 5 == 0)
                    Console.WriteLine("The max is"   max);
                if (i % 5 == 0)
                    Console.WriteLine("The min is"   min);
                if (i % 5 == 0)
                    Console.WriteLine("-----First 5");
            }
  

Я готов лечь спать, но не хочу спать побежденным. Любое нажатие в правильном направлении будет оценено.

Комментарии:

1. Я вижу много ошибок в вашем коде … 1) Ваш внутренний цикл for изменяет переменную внешнего цикла for a . 2) 3 if условия одинаковы. О ваших требованиях: вы можете сделать так, как предложено Jamiec

Ответ №1:

Вы можете легко добиться этого, используя методы LINQ Skip docs и Take docs. Просто прочитайте текст, используя File.ReadAllLines документы, затем пропустите и используйте по мере необходимости:

 var lines = File.ReadAllLines("values.txt").Skip(5).Take(5);
//lines now has lines 6-10
  

Если вы делаете это несколько раз, я бы предложил разделить это на доступ к файлам и linq:

 var allLines = File.ReadAllLines("values.txt")
var lines6To10 = allLines.Skip(5).Take(5);

... // Later on 

var lines21To25 = allLines.Skip(20).Take(5)
  

Что касается остальной части вашего кода .. похоже, вы пытаетесь найти min / max из строк, которые должны содержать только целые числа.

 var min = int.MaxValue;
var max = int.MinValue;
foreach(var line in lines)
{
   var value = int.Parse(line);
   if(value > max)
      max = value;
   if(value < min)
      min = value;
}
  

Это можно увидеть в примере строки: http://rextester.com/rundotnet?code=SHP19181 (Обратите внимание на другой способ загрузки чисел, так как rext tester не может загружаться из файла. Принцип тот же, хотя)

Комментарии:

1. для нескольких вызовов я бы сначала прочитал все строки и сохранил их в list<string>, а затем использовал linq Skip и Take — так что у вас не так много файловых операций.

Ответ №2:

Если вы хотите использовать StreamReader (например, потому что размер файла должен быть большим), вы можете сделать это следующим образом:

 using (TextReader tr = new StreamReader("values.txt"))
{
    string currentLine = null;

    do
    {
        Console.WriteLine("processing set of 5 lines");

        for (int i = 0; i < 5; i  )
        {
            currentLine = tr.ReadLine();
            if (currentLine == null)
            {
                break;
            }

            Console.WriteLine("processing line {0} of 5", i);
            // your code goes here:
        }

    } while (currentLine != null);
}
  

Редактировать: и вы должны использовать свой StreamReader внутри a using block (код обновлен).

Комментарии:

1. Это нормально для строк от 0 до 5, но как бы OP обрабатывал строки x y . Скажем, строки 20-25.

2. @Jamiec: Ну, OP запросил «определенный rang в текстовых строках», который лучше учитывается в вашем ответе. Но он также попросил » Например, строки 1-5, затем 6-10 и т. Д. «, Что может быть достигнуто с помощью этого StreamReader подхода.