Модераторы: mihanik

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Заставить Excell отрывать большие файлы txt 
V
    Опции темы
temr
Дата 6.12.2007, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Добрый день всем!
Стоит следующая задача 
в текстовый файл сохраняются определенные показатели из программы далее необходимо импортировать каждое значение в отдельную ячейку Экселя . Написал код и алгоритм на отладочном файле все работает . Засунул экселю полный файл - выдает ошибку #9
Начальный код был такой 

 
Код

Sub readfile()
Dim buf As String, cur, la() As String: Dim l As Long

Set fg = Worksheets("input")
Set list2 = Worksheets("MNEMONICS")
mmnem = 1

Open "D:\RSM\OIL\CENTER\CNTR.RSM" For Binary As #1
l = LOF(1)
buf = String(l, Chr(0))
Get #1, , buf
Close #1

la = Split(buf, vbCrLf) 

DoEvents
For ll = 0 To UBound(la) '(здесь выдает ошибку при попытке загрузки в массив la() файла размером 19 мегабайт UBound(la) равен 0 )

Do Until la(ll) Like " DATE*" '(Это флаг в теле файла с кторого необходимоначать анализировать записи)
ll = ll + 1
Loop

UU = ll
Do Until la(UU) Like "1 *" '(Это флаг в теле до которого необходимо начать анализировать записи)

UU = UU + 1
Loop
.....
End sub 
 




Буду благодарен всем кто поможет найти решение именно с загрузкой файла в массив так как остальная часть алгоритма уже отлажена и работает 
С уважением
Тимур

PM MAIL   Вверх
kapbepucm
Дата 7.12.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: 3
Всего: 12



У меня работает с файлом, размер которого 27.5MB
Код
Sub readfile()
  Dim buf As String, la() As String
  Dim l As Long, ll As Long
  Dim Na4alo As Long, Konec As Long
  Open "путь\Text.txt" For Binary As #1
  l = LOF(1)
  buf = String(l, Chr(255))
  Get #1, , buf
  Close #1
  la = Split(buf, vbCrLf)
  For ll = 0 To UBound(la)
    If la(ll) Like " DATE*" Then Exit For
  Next ll
  Na4alo = ll + 1
  For ll = Na4alo To UBound(la)
    If la(ll) Like "1 *" Then Exit For
  Next ll
  Konec = ll - 1
  MsgBox "Обрабатываем массив ""la"" с элемента номер " & Na4alo & " и до " & Konec & "(включительно)"
End Sub



--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
Akina
Дата 7.12.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(temr @  6.12.2007,  20:50 Найти цитируемый пост)
Засунул экселю полный файл - выдает ошибку #9

Пожалуйста, процитируйте сообщение об ошибке с точностью до запятой.
Попробуйте также вставить перед сбойной строкой нечто вида:
Код

n = UBound(la)
Debug.Print n

И потом - озаботьтесь к выложенному коду добавить декларации ВСЕХ переменных, которые в нем использованы. С четким указанием где и как именно они определены.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
temr
Дата 10.12.2007, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Цитата(kapbepucm @ 7.12.2007,  11:36)
У меня работает с файлом, размер которого 27.5MB[code=vb]Sub readfile()
 

Работает но если вывести Ubound(la) то его значение равно 0 
тогда как как вы понимаете оно должно быть отличное от нуля 
PM MAIL   Вверх
temr
Дата 10.12.2007, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Цитата(Akina @ 7.12.2007,  11:54)
Цитата(temr @  6.12.2007,  20:50 Найти цитируемый пост)
Засунул экселю полный файл - выдает ошибку #9
Пожалуйста, процитируйте сообщение об ошибке с точностью до запятой.
И потом - озаботьтесь к выложенному коду добавить декларации ВСЕХ переменных, которые в нем использованы. С четким указанием где и как именно они определены.

Полный код следующий
 
Код

Sub readfile()
Dim buf As String, cur, la() As String: Dim l As Long

Set fg = Worksheets("input")
Set list2 = Worksheets("MNEMONICS")
mmnem = 1

Open "F:\1.RSM" For Binary As #1
l = LOF(1)
buf = String(l, Chr(0))
Get #1, , buf
Close #1

la = Split(buf, vbCrLf)

DoEvents

For ll = 0 To UBound(la) 
Do Until la(ll) Like " DATE*" 
ll = ll + 1
Loop

uu = ll
Do Until la(uu) Like "1 *" 
uu = uu + 1
Loop

ll = ll + uu
Next ll
End Sub


1.rsm аски файл 
buf As String использую для загрузки текстового файла в буфер
la() As String использую при построковой нарезке файла из буфера в массив la()
при обработке файла размером до 4 мегабайт код работатет 
При попытке обработатать файл размером больше 10 мегабайт в теле цикла  For ll = 0 To UBound(la) выдает ошибку с кодом 9 то есть почему то UBound(la)=0 
Ошибка же если не ошибаюсь получается из за того что я пытаюсь сослаться на элемент массива  UBound(1) который является за пределом начального UBound(0)
Вопрос почему код программы при разбиении файла из буфера берет в массив только первую строчку то есть UBound(0)

PM MAIL   Вверх
Akina
Дата 10.12.2007, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Повторяю:
Цитата(Akina @  7.12.2007,  12:54 Найти цитируемый пост)
озаботьтесь к выложенному коду добавить декларации ВСЕХ переменных, которые в нем использованы. С четким указанием где и как именно они определены. 


Цитата(temr @  10.12.2007,  09:08 Найти цитируемый пост)
При попытке обработатать файл размером больше 10 мегабайт в теле цикла  For ll = 0 To UBound(la) выдает ошибку с кодом 9 то есть почему то UBound(la)=0 

Да с какой радости сделан именно этот вывод???

Цитата(temr @  10.12.2007,  09:08 Найти цитируемый пост)
Ошибка же если не ошибаюсь получается из за того что я пытаюсь сослаться на элемент массива  UBound(1) который является за пределом начального UBound(0)

Ошибаетесь, ошибаетесь. 

Я уж и не говорю о том, что изменение итерационной переменной внутри итерационного цикла не является допустимым, поскольку не документирована точка пересчета.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
kapbepucm
Дата 10.12.2007, 10:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 993
Регистрация: 14.6.2007
Где: Латвия

Репутация: 3
Всего: 12



Цитата(temr @  10.12.2007,  07:39 Найти цитируемый пост)
Работает но если вывести Ubound(la) то его значение равно 0 тогда как как вы понимаете оно должно быть отличное от нуля  
Код
Sub readfile()
  Dim buf As String, la() As String
  Dim l As Long, ll As Long
  Open "путь\Text.txt" For Binary As #1 ' текстовой файл 27.5 MB, строки по 20 символов
  l = LOF(1)
  buf = String(l, Chr(255))
  Get #1, , buf
  Close #1
  la = Split(buf, vbCrLf)
  MsgBox UBound(la) ' здесь у меня 0 не выдаёт...
End Sub


Это сообщение отредактировал(а) kapbepucm - 10.12.2007, 10:12


--------------------
(С) kapbepucm
PM MAIL Skype   Вверх
temr
Дата 10.12.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Повторяю:
Цитата(Akina @  7.12.2007,  12:54 Найти цитируемый пост)
озаботьтесь к выложенному коду добавить декларации ВСЕХ переменных, которые в нем использованы. С четким указанием где и как именно они определены. 


Может быть я чего то не догоняю но я указал все переменные которые использую 
массив la() как текстовый 
buf как текстовый


Цитата(Akina @  7.12.2007,  12:54 Найти цитируемый пост)

Да с какой радости сделан именно этот вывод???

А с такой радости что при загрузке как было написано выше файла меньшего(2М) размера UBound(la)=19516

А при загрузке файла начального размера 16М  UBound(la)=0

Цитата(Akina @  7.12.2007,  12:54 Найти цитируемый пост)

Ошибаетесь, ошибаетесь. 


Если ошибаюсь тогда почему с файлом размером меньше все работатает 

Вообщем проблема есть помогите разобраться 
PM MAIL   Вверх
Akina
Дата 10.12.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(temr @  10.12.2007,  14:54 Найти цитируемый пост)
я указал все переменные которые использую 

Возьмем код последнего постинга.  В нем использованы переменные: 
buf cur la() l fg list2 mmnem ll uu 
Только первые 4 описаны.
Цитата(temr @  10.12.2007,  14:54 Найти цитируемый пост)
при загрузке как было написано выше файла меньшего(2М) размера UBound(la)=19516

А при загрузке файла начального размера 16М  UBound(la)=0

1) Вы проверили, что ноль? Debug.Print, WatchDog или MsgBox выводят именно ноль?
2) Как ведет себя код на файле в 20, 30, 40, 50 тыс. строк? где порог возникновения проблемы? впрочем, сразу проверяйте 32767 и 32768 строк.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
temr
Дата 10.12.2007, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Я сейчас проверил длину строки элемента массива la(ll) полученного при разделении файла  2М она составляет 131 символ 
Длинна строки элемента массива la(ll) полученного при разделении  исходного файла 16М составляет 17199180 то есть получается что формируется массив с одним элементом в которому присваивается значение исходного файла 
Где ошибка ?
Как правильно разделить файл ?


Цитата

buf cur la() l fg list2 mmnem ll uu 
Только первые 4 описаны.

Да не описал согласен сорри
list2 - рабочий лист куда записываем содержание элементов массива  la(ll)
mmnem-рабочий лист куда записываем шапки таблиц текстового файла 
 ll uu - переменные типа лонг индексы массива в рамках которого выполняется обработка тескстовых значений
Цитата

1) Вы проверили, что ноль? Debug.Print, WatchDog или MsgBox выводят именно ноль?


Проверил MsgBox выводит 0

Цитата

2) Как ведет себя код на файле в 20, 30, 40, 50 тыс. строк? где порог возникновения проблемы? впрочем, сразу проверяйте 32767 и 32768 строк.

в файле 2М количество строк 19516 он работает 
соответственно в начальном файле 16 М строк приблизительно 131 000 может быть в этом проблема ?

Это сообщение отредактировал(а) temr - 10.12.2007, 14:25
PM MAIL   Вверх
temr
Дата 12.12.2007, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Кто нибудь поможет советом?
PM MAIL   Вверх
Akina
Дата 12.12.2007, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(temr @  10.12.2007,  15:11 Найти цитируемый пост)
Я сейчас проверил длину строки элемента массива la(ll) полученного при разделении файла  2М она составляет 131 символ 
Длинна строки элемента массива la(ll) полученного при разделении  исходного файла 16М составляет 17199180 то есть получается что формируется массив с одним элементом в которому присваивается значение исходного файла 
Где ошибка ?

Вариантов два:
1) не выполняется разделение, если получается более 32к элементов в массиве
2) не выполняется разделение, если длина строки превышает 2М либо 4М
Проверить, какой из вариантов правилен, можно только созданием тест-файлов с заданными характеристиками.

Выход - в изменении технологии считывания. Скажем, используя string[] System.IO.File.ReadAllLines()


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
temr
Дата 13.12.2007, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Akina, спасибо за совет 
а не подскажи те как будет выглядеть настоящий код с использованием оператора string[] System.IO.File.ReadAllLines()  
Тимур
PM MAIL   Вверх
Akina
Дата 13.12.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Нет.

Извольте озаботиться поиском этой информации в МСДН - есть его там.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
temr
Дата 13.12.2007, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Akina, я бы посоветовал будь на вашем месте 
Удачи
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Программирование, связанное с MS Office"
mihanik staruha

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами



  • Несанкционированная реклама на форуме запрещена
  • Пожалуйста, давайте своим темам осмысленный, информативный заголовок. Вопль "Помогите!" таковым не является.
  • Чем полнее и яснее Вы изложите проблему, тем быстрее мы её решим.
  • Оставляйте свои записи в "Книге отзывов о работе администрации"
  • А вот тут лежит FAQ нашего подраздела


Если Вам понравилась атмосфера форума, заходите к нам чаще!
С уважением mihanik и staruha.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Программирование, связанное с MS Office | Следующая тема »


 




[ Время генерации скрипта: 0.1781 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.