Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42

Чтение текстового файла столбцами

28.08.2012, 17:52. Показов 2801. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем суть. Есть тхт файл, в котором в виде таблице данные: слово, столбец в котором 0 или 1,время(в формате 00:00:00), столбец в котором 0 или 1
Пример:
Привет 1 00:00:02 0
Нужно в забить 2 массива, один содержанием второго столбца (0 или 1), и второй содержанием 3 столбца (временем).
И еще, время - это время за которое набирают слово и нажимают пробел. Считается оно криво, записывается системное время между нажатиями на пробел и вычитается предыдущее время. Можно ли перевести время в нормальные секунды или вычислять время как-то по иному?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.08.2012, 17:52
Ответы с готовыми решениями:

Чтение строк из текстового файла
Помогите с кодом! Имеется текстовый файл, в к-ом построчно идут вопрос, 4 варианта ответов, следующий вопрос, 4 варианты ответов и т.д....

Чтение текстового файла в TextBox построчно
Загружаю файл где текст расположен в столбик как стихотворение. но он все складывает в кучу. Как это исправить? Dim Numb As Integer ...

Чтение из текстового файла не только первой строчки
Такая проблема, в общем. Есть файл с несколькими строками. Например, первая строчка - путь к базе данных, вторая - путь к бэкапам и так...

21
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
28.08.2012, 18:02
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Load_File(Fname as string, Arr_1() as string, Arr_2() as string)
      fi%=FreeFile
      Open Fname for Input As #fi%
      k%=0
      Do While Not EOF(fi%)
          Line input #fi%,Stri$
          Tmp=Split(Stri$," ")
          k%=k%+1
          Arr_1(k%)=Tmp(1)
          Arr_2(k%)=Tmp(2)
      Loop
      Close #fi%
End Sub
Замечание: массивы должны быть созданы в вызывающей программе и иметь достаточную длину.
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
28.08.2012, 18:54  [ТС]
10 и 11 строчки кода. Я так понимаю - это мы берем на каждом цикле 1 и 2 элемент сплита? И так в каждой лайне?
0
6644 / 1511 / 169
Регистрация: 09.01.2010
Сообщений: 4,298
28.08.2012, 19:28
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
Привет 1 00:00:02 0
в роли 'Привет' предполагается только одно слово ?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
28.08.2012, 19:30
Да. Только имейте в виду, что результат Split - это массив, индексируемый с нуля. Поэтому на самом деле мы берем второе и третье поля.

Добавлено через 40 секунд
Цитата Сообщение от gaw Посмотреть сообщение
в роли 'Привет' предполагается только одно слово ?
- я полагал, что да.
0
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
28.08.2012, 19:55  [ТС]
Да, про массив и сплит в курсе. В первом столбце всегда одно слово. А что со временем можите предложить?
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,907
28.08.2012, 20:22
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
А что со временем можите предложить?
Предлагаю использовать вместо Time (или Now) для измерения интервала Timer.
Как пример -
Visual Basic
1
2
3
4
5
6
7
8
Function TM() As Double 'время в секундах с учетом перехода на новые сутки
    Static D As Integer, OldT As Double
    Dim t As Double
    t = Timer
    D = D - (t < OldT)
    OldT = t
    TM = t + D * 86400#
End Function
Точность до 1/64 секунды.
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
02.09.2012, 00:00  [ТС]
По итогу время выводит не понятно в каких единицах, получается число вроде 10011,939 вместо 2х-3х секунд.

Добавлено через 38 минут
Castail, ничего не пойму, массивы объявил, а все равно пишет expected array. И еще, не совсем понимаю, что записывается на переменную Fname?

Добавлено через 32 минуты
А все, я олень, с ошибкой разобрался А вот в массивы ничего не попадает, ошибка Subcript out of range и выделяет строку Arr_1(k%)=Tmp(1), элемент пустой. Видимо из-за того, что в моем файле столбцы формируются через Tab(15), Tab(30) и т.д. По этому, количество пробелов между 1 и 2 столбцом зависит от длинны слова в 1 столбце. Можно ли как то подправить? Не хочется ломать текстовый файл...
Ради интереса попробовал отпилить нулевой элемент сплита, слово в tmp(0) отображается, а на Arr_1 все равно такая же ошибка.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,907
02.09.2012, 08:18
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
время - это время за которое набирают слово и нажимают пробел
Цитата Сообщение от Апострофф Посмотреть сообщение
Visual Basic
1
2
3
4
5
6
7
8
Function TM() As Double 'время в секундах с учетом перехода на новые сутки
 Static D As Integer, OldT As Double
 Dim t As Double
 t = Timer
 D = D - (t < OldT)
 OldT = t
 TM = t + D * 86400#
End Function
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
По итогу время выводит не понятно в каких единицах, получается число вроде 10011,939 вместо 2х-3х секунд
А так?
Visual Basic
1
2
3
4
Private Sub Text1_KeyPress(KeyAscii As Integer)
If Text1 = "" Then t1 = TM: Caption = Format(TM, "0.00")
If KeyAscii = AscW(" ") Then Caption = Format(TM - t1, "0.00")
End Sub
PS: Конец ввода - пробел.
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
02.09.2012, 09:15
По этому, количество пробелов между 1 и 2 столбцом зависит от длинны слова в 1 столбце. Можно ли как то подправить? Не хочется ломать текстовый файл.
Можно считать весь файл:
Visual Basic
1
2
3
4
5
   Dim File As String, CF As String    'объявим пеpеменнyю для имени файла и его cодеpжимого 
   File = "d:\ca.log"    'ycтановим имя файла и пyть 
   Open File For Binary As #1    'откpоем файл для чтения 
      CF = Input(FileLen(File), 1)   'загpyзить в пеpеменyю CF вcе cодеpжимое файла 
   Close #1    'закpыть файл
Потом "привести в порядок":
Visual Basic
1
2
3
Do While Instr(1, CF, "  ") > 0 Then ' между кавычками 2 пробела
CF = Replace(CF,"  ", " ")
loop
1
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
02.09.2012, 10:03
Цитата Сообщение от Alex77755 Посмотреть сообщение
Можно считать весь файл
ИМХО неудобно потом парсить.
Лучше считывать построчно и удалять множественные пробелы в строке:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
          Line input #fi%,Stri$
          Tmp=Split(ATrim(Stri$)," ")
 
 
Function ATrim(s As String) As String
Dim i&, i1&
ATrim = Trim$(s)
i1 = Len(ATrim)
Do
    i = i1
    ATrim = Replace$(ATrim, "  ", " ")
    i1 = Len(ATrim)
Loop Until i = i1
End Function
Добавлено через 5 минут
Или так - неоптимально, зато в одну строку
Visual Basic
1
2
3
Function ATrim1(s As String) As String
Dim d$: d = Trim$(Replace$(s, "  ", " ")): If Len(s) = Len(d) Then ATrim1 = s Else ATrim1 = ATrim1(d)
End Function
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
02.09.2012, 11:34
ИМХО неудобно потом парсить.
Спорить не буду, учитавая ваш опыт...
Но мне удобней так: Считал одной строчкой, в цикле удалил лишние пробелы...
Потом Splitoм разбил на массив строк и обрабатываю построчно в цикле разбивая каждую строку на слова.
0
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
03.09.2012, 15:00  [ТС]
Апостофф, а не подскажешь, почему отсчет времени начинается с 67200+
пример:
1слово 67268
2слово 67270
3слово 67274
А мне нужно
1слово 1
2слово 2
3слово 4

Добавлено через 15 минут
И для чего строчка?
Visual Basic
1
If KeyAscii = AscW(" ") Then Caption = Format(TM - t1, "0.00")
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,907
03.09.2012, 15:02
67268 - к-во секунд с полуночи.
Цитата Сообщение от Immediate (Ctrl+G)
?cdate(67268/86400#)
18:41:08
Вам же нужна разница между началом и концом ввода.
Приглядитесь к последнему коду Private Sub Text1_KeyPress - https://www.cyberforum.ru/post3410804.html
Там это учтено

Добавлено через 1 минуту
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
И для чего строчка?
Как раз об этом и написал выше.
0
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
03.09.2012, 17:58  [ТС]
блин, все равно хрень выходит... Переменная D всегда пуста. Я не сказал одну важную вещь. А лучше вообще объяснить весь концепт проги. В общем есть текстовое поле, Туда вводится слово и по нажатию на пробел это слово переносится в лэйбл, поле ввода обнуляется для следующего, и в текстовый файл заносится слово, время и еще несколько параметров. Если введено не верное слово, то по нажатию на пробел оно исчезает, а в текстовый файл заносится та же информация.
0
 Аватар для Апострофф
9908 / 3924 / 742
Регистрация: 11.10.2011
Сообщений: 5,907
03.09.2012, 18:21
Visual Basic
1
2
3
4
5
6
7
8
Private Sub Text1_Change()
STATIC t1 As Single  '!!!
If Len(Text1) = 1 Then t1 = Timer
If Right$(Text1, 1) = " " Then
  Label1 = Text1 & Format(Timer - t1, "0.00")
  Text1 = ""
End If
End Sub
1
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
03.09.2012, 21:21  [ТС]
а что значит знак $ в конце некоторых операторов?

Добавлено через 5 минут
а по поводу другого вопроса, сейчас переделал "топорно", по свойму
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
f = FreeFile
Open App.Path & "\TEST.txt " For Input As #f   
Do While Not EOF(f)
    Line Input #f, CF
    Do While InStr(1, CF, "  ") > 0  
        CF = Replace(CF, "  ", " ")
    Loop
    tmp = Split(CF, " ")
    k = k + 1
    Arr1(k) = tmp(1)
    Arr2(k) = tmp(2)
Loop
Close #f
И выделяет строчку с Arr1 с ошибкой Subscript out of range. Никак не пойму что не так. Массивы описаны...
0
64 / 20 / 1
Регистрация: 29.07.2012
Сообщений: 151
03.09.2012, 21:42
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
а что значит знак $ в конце некоторых операторов?
Это означает что данная переменная или функция будет именно строкового типа.

Например вместо
Visual Basic
1
dim a as string
ты пишешь
Visual Basic
1
a$
и дело в ажуре

Добавлено через 9 минут
Цитата Сообщение от RNDPhoenix Посмотреть сообщение
Subscript out of range
У тебя значит размерность массива неподходящая под переменную k
Объяви массив так чтоб его наибольшая граница была >= k Вроде всё.
1
 Аватар для Alex77755
11525 / 3812 / 683
Регистрация: 13.02.2009
Сообщений: 11,229
03.09.2012, 22:40
Объяви массив так чтоб его наибольшая граница была >= k
А лучше переопределяй с сохранением в цикле : Redim Preserve
0
0 / 0 / 1
Регистрация: 22.04.2012
Сообщений: 42
04.09.2012, 03:28  [ТС]
"К" - это обычный счетчик. Ошибка вылезает при к=0. А можно про Redim Preserve подробнее?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.09.2012, 03:28
Помогаю со студенческими работами здесь

Чтение последних 100 строк из текстового файла
Нужно реализоваться сабж. Размеры файлов в пределах 40-100мб. Прога должна через указанный промежуток времени открывать файл и...

Чтение из текстового файла строк или слов в произвольном порядке
Доброго Времени суток! Продолжаю писать проект. Есть такое задание: Пользователю из текстового файла(txt.txt) выдается слово в Label ...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...

Чтение из одного текстового файла и копирование на другой текстового файл с заменой пробелов на "_"
Здравствуйте, помогите пожалуйста с паскалем. Надо прочитать текстовый файл (в нем строки с именами типа: Имя Фамилия; в каждой строке одно...

Чтение из одного текстового файла и копирование на другой текстового файл с заменой пробелов на "_"
Здравствуйте, помогите пожалуйста с паскалем. Надо прочитать текстовый файл (в нем строки с именами типа: Имя Фамилия; в каждой строке одно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru