powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как быстро узнать количество строк в файле?
16 сообщений из 16, страница 1 из 1
А как быстро узнать количество строк в файле?
    #38945006
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конкретно сейчас делаю.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
      Using file As System.IO.StreamReader = _
       New System.IO.StreamReader(ListFile, System.Text.Encoding.Default) 'ANSI
        Do
          str_to_add = file.ReadLine()
          If str_to_add Is Nothing Then Exit Do
          'далее следует элементарная обработка str_to_add и добавление результата в ListView
        Loop
      End Using


Для "красоты" мне не хватает знания количества строк (StreamReader его заранее не знает)

В VB6 я пользовался классом cText:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
Option Explicit
'Для представления текста в виде коллекции
Dim cText As New Collection

Property Get stroka(NUMBER As Long)
  'Получить строку по номеру
  stroka = cText(NUMBER)
End Property

Property Get count()
  'Получить количество строк
  count = cText.count
End Property

Sub OpenText(Path As String)
  'Открываем текст для использования как коллекции
  'Path - имя файла с текстом
  Dim FileHandle As Integer
  Dim str As String
  FileHandle = FreeFile
  Open Path For Input As #FileHandle
  Do While Not EOF(FileHandle)
    Line Input #FileHandle, str
    cText.Add str
  Loop
  Close #FileHandle
End Sub

Sub SaveText(Path As String, Optional Append As Integer)
  'Сохраняем текст коллекции как файл
  'path - имя файла в который сохраняем текст
  'Если параметр Append=1 тогда информация будет
  'добавлена в конец существующего файла,
  'иначе ранее хранившаяся информация будет стерта
  Dim FileHandle As Integer
  Dim varElement As Variant
  FileHandle = FreeFile
  If Append = 1 Then
    Open Path For Append As #FileHandle
    For Each varElement In cText
      Print #FileHandle, varElement
    Next
    Close #FileHandle
  Else
    Open Path For Output As #FileHandle
    For Each varElement In cText
      Print #FileHandle, varElement
    Next
    Close #FileHandle
  End If
End Sub

Sub Add(stroka As String, Optional NumberToAdd As Long)
  'Добавить строку в конец текста
  'Если параметр NumberToAdd указан тогда
  'строка будет добавлена в указанное место
  If NumberToAdd <> 0 Then
    cText.Add stroka, , Before:=NumberToAdd
  Else
    cText.Add stroka
  End If
End Sub

Sub Delete(NumberToDelete As Long)
  'Удаляем строку с указанным номером
  cText.Remove (NumberToDelete)
End Sub

Sub ClearText()
  'Очистить текст
  Do While cText.count > 0
    cText.Remove (1)
  Loop
End Sub

Sub Replace(NumberToReplace As Long, stroka As String)
  'Заменить строку с указанным номером на новую строку
  cText.Add stroka, , NumberToReplace
  cText.Remove NumberToReplace + 1
End Sub



Дерьмовенький, но для указанных целей самое оно,
т.е. сразу читаем (работает быстро), потом циклом добавляем.

Как лучше поступить?
Написать такой же класс, кот. через StreamReader все сразу читает построчно в коллекцию?
А потом уже с этим работать циклом.

Да, и чего использовать?
StreamReader? Или примитивное открытие "Open Path For Input As #FileHandle" как и в VB6?
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945019
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверка пудинга заключается в том, что его съедают(с)
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945023
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

Ну и?
Код VB6 съедает файл полностью (Sub OpenText ).

1)Писать такой же класс?

2)Через Open=StreamReader (+дописывать Save=StreamWriter когда понадобится)?

Доки утверждают что "Stream-ы" быстрее, функции для работы с #FileHandle во всяком случае в VB.NET присутствуют.
Я авансом вижу только одно преимущество - параметр кодировка (отвечает моим текущим установкам ориентироваться на UTF-8).

3)Строки в коллекции хранить?
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945025
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо ничего хранить
Читать файл как двоичный используя один буфер и просто подсчитать количество байтов 0x0a
Если последний байт отличен от 0x0a - добавить 1
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945045
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

а нафига мне два раза в файл лезть и байты копать? Если мне все строки все одно потом понадобятся.

Я сделал по образу и подобию (только то что сейчас нужно, да и остальное фигня если понадобится).

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Public Class c_Text

  'Для представления текста в виде коллекции
  Private cText As New Collection

  Public Sub OpenText(ByVal path As String)
    'Открываем текст для использования как коллекции
    'Path - имя файла с текстом
    Try
      Using file As System.IO.StreamReader = _
       New System.IO.StreamReader(path, System.Text.Encoding.Default) 'ANSI либо BOM
        Dim line As String
        Do
          line = file.ReadLine()
          If line Is Nothing Then Exit Do
          cText.Add(line)
        Loop
      End Using
    Catch
    End Try
  End Sub

  Public ReadOnly Property count() As Integer
    Get
      'Получить количество строк
      Return cText.Count
    End Get
  End Property

  Public ReadOnly Property stroka(ByVal Index As Integer) As String
    Get
      'Получить строку по номеру
      Return cText(Index)
    End Get
  End Property

  Public Sub ClearText()
    'Очистить текст
    cText.Clear()
  End Sub

End Class



Вот тест на 50000 строк
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim ctext As New c_Text
    ctext.OpenText("C:\444\50000test.txt")
    MsgBox(ctext.count) 'выводит 50000
    For i As Integer = 1 To 3 'выводит 3 первые строки
      MsgBox(ctext.stroka(i))
    Next
    ctext.ClearText()
    MsgBox(ctext.count) 'выводит 0
  End Sub


Число строк 50000 моментом возвращает(короткие правда -номера телефонов).
И строки все в кармане.

Чем плохо? Я думаю сойдет. Вот в ListView это добавлять несколько дольше будет (это тест, обычно столько не надо).
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945068
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, для этой задачи проще использовать File.ReadAllLines
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945069
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

для отображения больших списков использует визуализация.
но важно понимать, что конечному пользователю нафиг не сдался список в 50000 записей, так как просмотреть их у него нет возможности.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945078
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Если мне все строки все одно потом понадобятся.
а я откуда знаю нужны они одновременно или нет?

может ты индекс по ходу подсчёта строишь?
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945079
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesтак как просмотреть их у него нет возможности
кто вам это сказал? если не всякий может, не означает ненужность никому
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945085
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazileдля этой задачи проще использовать File.ReadAllLines
Ты уверен?
Вот накидал навскидку:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Public Class c_Text

  'Для представления текста в виде массива строк
  Private cText() As String

  Public Sub OpenText(ByVal path As String)
    'Открываем текст для использования как коллекции
    'Path - имя файла с текстом
    Try : cText = IO.File.ReadAllLines(path, System.Text.Encoding.Default) : Catch : End Try 'ANSI либо BOM
  End Sub

  Public ReadOnly Property count() As Integer
    Get
      'Получить количество строк
      Return cText.Count
    End Get
  End Property

  Public ReadOnly Property stroka(ByVal Index As Integer) As String
    Get
      'Получить строку по номеру
      Return cText(Index)
    End Get
  End Property

  Public Sub ClearText()
    'Очистить текст
    cText = Nothing
  End Sub

End Class


С одной стороны да, ReadAllLines типа одной строчкой удобнее.
Но сразу куча вопросов.
За корректность cText = Nothing не ручаюсь.
Использовать ReDim? Но меньше одного элемента массива уже не сделаешь.
Нумерация 0-based а не 1-based
Return cText.Count для пустого массива - исключение.
А если буду удалять строки из середины? Сдвигать элементы массива? У меня есть алгоритм где я такое делаю (очередь сообщений в трей), но мудохаться с этим здесь - перебор.

Мне кажется, коллекция удобней - модель легче, проигрыша по скорости - либо никакого, либо спички, а м.б. даже быстрее.

Если для "данной задачи", то м.б. да, а если инкапсулировать в класс - то думаю нет.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945131
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропил,

то есть по вашему пользователь будет просматривать 50000 строк? ему это надо? если есть поиск, то он им воспользуется, если его нет, он посмотрит первые 100 и потом выкинет вашу программу в корзину и правильно сделает.
компьютеры созданы, чтоб решать проблемы, а не создавать их.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945155
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилRoman Mejtesтак как просмотреть их у него нет возможности
кто вам это сказал? если не всякий может, не означает ненужность никомуМожет paging всех спасёт?
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945164
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,

Paging имхо, это худший вариань. Лучше всего сделать метод возвращающий перечисление, и загружать строки по мере того, как это перечисление загружается. Предварительно получить из этого перечисления ~500 строк.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38945178
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ребят,
ничего что я вмешиваюсь в вашу беседу?
вопрос к ListView отношения не имел, что вы спорите.

Ну, если интересно, в этот Listview у меня добавляется обычно несколько номеров телефонов кнопкой Add (по одному).
Но есть кнопка Add From File, и да там можно добавить и несколько тысяч, и все нумеруется 1,2,3,...10000.
После чего юзер может бегло просмотреть чего добавилось (если хочет, просто чтоб убедиться что добавилось 10000 а не 10) и нажать Send, после чего будет создано N идентичных "заданий" и произведена "рассылка" по ним. 10000 записей добавятся за 2 сек. Какая нахрен виртуализация. Единственное что я сделал, это использовал параллельную коллекцию, чтобы быстро отсекать дублирование телефонов при добавлении, о чем я спрашивал в соседнем топике.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38946972
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman MejtesАлексей К,

Paging имхо, это худший вариань.И при этом используется в Web повсеместно.
...
Рейтинг: 0 / 0
А как быстро узнать количество строк в файле?
    #38947056
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77С одной стороны да, ReadAllLines типа одной строчкой удобнее.

Не в строчке дело, а в задаче "прочитать строки из текстового файла", указанная функция File.ReadAllLines делает ИМЕННО ТО, ЧТО ТРЕБУЕТСЯ .

Дмитрий77Но сразу куча вопросов.

Какая ещё куча вопросов? Есть метод, который... смотри выше. Выделил жирненьким и красненьким для усвоения.

Дмитрий77Использовать ReDim? Но меньше одного элемента массива уже не сделаешь.

Какой ещё нафиг ReDim, это массив, с неизменяемой длинной.

Дмитрий77Нумерация 0-based а не 1-based

Я без понятия как там в VB.NET и даже знать не хочу, но в C# все массивы индексируются с нуля.

Дмитрий77Return cText.Count для пустого массива - исключение.

У массива нет Count, но есть Length, который всегда возвращает значение, даже если массив пустой (вернёт 0).

Дмитрий77А если буду удалять строки из середины? Сдвигать элементы массива? У меня есть алгоритм где я такое делаю (очередь сообщений в трей), но мудохаться с этим здесь - перебор.

А если хочешь работать с коллекцией таким образом, делаешь следующее:

Код: c#
1.
2.
var readedLines = File.ReadAllLines("file.txt");
var text = new LinkedList(readedLines);



Итого, в text у тебя зачётная коллекция, можно вставлять/удалять из середины, в начало, в конец, без всяких тупых ReDim-ов. Очень быстро.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А как быстро узнать количество строк в файле?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]