Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/быстрое считывание файла *.csv в массив 300 000 строк () - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » быстрое считывание файла *.csv в массив 300 000 строк () (Макросы/Sub)
быстрое считывание файла *.csv в массив 300 000 строк ()
SvetaS Дата: Суббота, 26.09.2015, 23:40 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
Задача считать файл *.csv обратно в массив
ПОБЫВАЛА, НО НЕ ПОМОГЛО :
1. TextFile2Array ИЗ http://excelvba.ru/code/TextFile2Array ТУТ
НО массив arr - остаётся пустым. Т.е. не проходит разделение файла по столбцам (ОШИБКА ВЛОЖЕНА В ФАЙЛЕ)

тут ошибка

2. может быть кто-то сможет подсказать как перевести функцию на VBA Excel
[vba]
Код
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         Dim Mass()
         Dim STR As String
         Mass = IO.File.ReadAllLines("D:\1.csv")
         STR = Split(Mass(2), ",")(3)
         MsgBox(STR)
     End Sub
[/vba]
Т.Е. меня интересует именно строка [vba]
Код
Mass = IO.File.ReadAllLines("D:\1.csv")
[/vba]
т.е. я пишу
[vba]
Код
Dim nn As Long
Dim la() As String
Dim lr() As String
Dim n As String
nn = 1
     Const ForReading = 1, ForWriting = 2, ForAppending = 3
     Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
     Dim fs, f, ts, s
     Set fs = CreateObject("Scripting.FileSystemObject")
              
    Set f = fs.GetFile("D:\file.csv")
        
    Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
[/vba]

но как вставить строку
[vba]
Код
Mass = IO.File.ReadAllLines("D:\1.csv")
[/vba]?

МОЖЕТ, ЧТО-ТО НЕ ТАК СО ВСТАВКОЙ РАЗДЕЛИТЕЛЕЙ В СТРОКУ, ПРИ ФОРМИРОВАНИИ ФАЙЛА ([vba]
Код
  s = s & vbTab & m(i, ii)
[/vba])?
в файле свыше 300 000 строк
К сообщению приложен файл: file1.csv (4.0 Kb)
 
Ответить
СообщениеЗадача считать файл *.csv обратно в массив
ПОБЫВАЛА, НО НЕ ПОМОГЛО :
1. TextFile2Array ИЗ http://excelvba.ru/code/TextFile2Array ТУТ
НО массив arr - остаётся пустым. Т.е. не проходит разделение файла по столбцам (ОШИБКА ВЛОЖЕНА В ФАЙЛЕ)

тут ошибка

2. может быть кто-то сможет подсказать как перевести функцию на VBA Excel
[vba]
Код
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
         Dim Mass()
         Dim STR As String
         Mass = IO.File.ReadAllLines("D:\1.csv")
         STR = Split(Mass(2), ",")(3)
         MsgBox(STR)
     End Sub
[/vba]
Т.Е. меня интересует именно строка [vba]
Код
Mass = IO.File.ReadAllLines("D:\1.csv")
[/vba]
т.е. я пишу
[vba]
Код
Dim nn As Long
Dim la() As String
Dim lr() As String
Dim n As String
nn = 1
     Const ForReading = 1, ForWriting = 2, ForAppending = 3
     Const TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0
     Dim fs, f, ts, s
     Set fs = CreateObject("Scripting.FileSystemObject")
              
    Set f = fs.GetFile("D:\file.csv")
        
    Set ts = f.OpenAsTextStream(ForReading, TristateUseDefault)
[/vba]

но как вставить строку
[vba]
Код
Mass = IO.File.ReadAllLines("D:\1.csv")
[/vba]?

МОЖЕТ, ЧТО-ТО НЕ ТАК СО ВСТАВКОЙ РАЗДЕЛИТЕЛЕЙ В СТРОКУ, ПРИ ФОРМИРОВАНИИ ФАЙЛА ([vba]
Код
  s = s & vbTab & m(i, ii)
[/vba])?
в файле свыше 300 000 строк

Автор - SvetaS
Дата добавления - 26.09.2015 в 23:40
doober Дата: Воскресенье, 27.09.2015, 00:06 | Сообщение № 2
Группа: Друзья
Ранг: Ветеран
Сообщений: 947
Репутация: 323 ±
Замечаний: 0% ±

Excel 2010
но как вставить строку
Mass = IO.File.ReadAllLines("D:\1.csv")

Можно так
Mass = ReadAllLines("D:\1.csv")
[vba]
Код
Public Function ReadAllLines(ByVal FileName As String) As Variant
   Dim FSO , oFSTR , TArray()
   Dim ret As Long
   Dim lCtr As Long
   Set FSO = CreateObject("Scripting.FileSystemObject")
ReDim TArray(0)
   On Error GoTo ErrorHandler
      Set oFSTR = FSO.OpenTextFile(FileName)      
      Do While Not oFSTR.AtEndOfStream
             ReDim Preserve TArray(lCtr) As String
             TArray(lCtr) = oFSTR.ReadLine
             lCtr = lCtr + 1
             DoEvents  
     Loop
      oFSTR.Close     
ErrorHandler:
      Set oFSTR = Nothing
  ReadAllLines =TArray
End Sub
[/vba]
PS:Неужели нельзя решать вопрос в одном месте, а не разрываться на части.


 
Ответить
Сообщение
но как вставить строку
Mass = IO.File.ReadAllLines("D:\1.csv")

Можно так
Mass = ReadAllLines("D:\1.csv")
[vba]
Код
Public Function ReadAllLines(ByVal FileName As String) As Variant
   Dim FSO , oFSTR , TArray()
   Dim ret As Long
   Dim lCtr As Long
   Set FSO = CreateObject("Scripting.FileSystemObject")
ReDim TArray(0)
   On Error GoTo ErrorHandler
      Set oFSTR = FSO.OpenTextFile(FileName)      
      Do While Not oFSTR.AtEndOfStream
             ReDim Preserve TArray(lCtr) As String
             TArray(lCtr) = oFSTR.ReadLine
             lCtr = lCtr + 1
             DoEvents  
     Loop
      oFSTR.Close     
ErrorHandler:
      Set oFSTR = Nothing
  ReadAllLines =TArray
End Sub
[/vba]
PS:Неужели нельзя решать вопрос в одном месте, а не разрываться на части.

Автор - doober
Дата добавления - 27.09.2015 в 00:06
KSV Дата: Воскресенье, 27.09.2015, 05:00 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 770
Репутация: 255 ±
Замечаний: 0% ±

Excel 2013
Вариант, без использования сторонних компонентов.
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.
Но свободной памяти на компе нужно втрое больше, чем размер вашего файла csv. А если свободной памяти больше в 4 раза, то можно закоментировать последнюю строчку во внешнем цикле и это чуть ускорит процесс.
[vba]
Код
Option Base 1

' возвращает двухмерный массив
Function CSV2Array(ByVal FileName As String) As Variant()
     Open FileName For Binary As #1
     ReDim aData(LOF(1)) As Byte
     Get #1, , aData
     Close #1
      
     Dim TmpArr() As String
     TmpArr = Split(StrConv(aData, vbUnicode), vbCrLf)
     aData = "" ' освобождаем память, занятую массивом
      
     Dim nRow&, nCol&, v
     nRow = UBound(TmpArr)
     nCol = UBound(Split(TmpArr(1), vbTab)) + 1&
     ReDim Arr(nRow, nCol)
      
     For nRow = 1& To nRow
         nCol = 0&
         For Each v In Split(TmpArr(nRow), vbTab)
             nCol = nCol + 1&
             Arr(nRow, nCol) = v
         Next
         TmpArr(nRow) = "" ' сразу освобождаем память, занятую строкой массива
' если объем свободной памяти превышает размер файла csv более чем в 4 раза, то предыдущую строку можно закоментировать, чтобы чуть ускорить процесс
     Next
     CSV2Array = Arr
End Function
[/vba]


KSV.VBA@gmail.com
Яндекс.Деньги: 410011921213333
 
Ответить
СообщениеВариант, без использования сторонних компонентов.
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.
Но свободной памяти на компе нужно втрое больше, чем размер вашего файла csv. А если свободной памяти больше в 4 раза, то можно закоментировать последнюю строчку во внешнем цикле и это чуть ускорит процесс.
[vba]
Код
Option Base 1

' возвращает двухмерный массив
Function CSV2Array(ByVal FileName As String) As Variant()
     Open FileName For Binary As #1
     ReDim aData(LOF(1)) As Byte
     Get #1, , aData
     Close #1
      
     Dim TmpArr() As String
     TmpArr = Split(StrConv(aData, vbUnicode), vbCrLf)
     aData = "" ' освобождаем память, занятую массивом
      
     Dim nRow&, nCol&, v
     nRow = UBound(TmpArr)
     nCol = UBound(Split(TmpArr(1), vbTab)) + 1&
     ReDim Arr(nRow, nCol)
      
     For nRow = 1& To nRow
         nCol = 0&
         For Each v In Split(TmpArr(nRow), vbTab)
             nCol = nCol + 1&
             Arr(nRow, nCol) = v
         Next
         TmpArr(nRow) = "" ' сразу освобождаем память, занятую строкой массива
' если объем свободной памяти превышает размер файла csv более чем в 4 раза, то предыдущую строку можно закоментировать, чтобы чуть ускорить процесс
     Next
     CSV2Array = Arr
End Function
[/vba]

Автор - KSV
Дата добавления - 27.09.2015 в 05:00
SvetaS Дата: Воскресенье, 27.09.2015, 14:54 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
Ура ! заработало.... hands hands hands
Всем огромное Спасибо!!!!!!!!![img][/img]
 
Ответить
СообщениеУра ! заработало.... hands hands hands
Всем огромное Спасибо!!!!!!!!![img][/img]

Автор - SvetaS
Дата добавления - 27.09.2015 в 14:54
SLAVICK Дата: Воскресенье, 27.09.2015, 14:55 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
"Теоретически", в вышеприведенных примерах чтение не построчное, а всего файла целиком.

1-й пример - построчный, но
ReDim Preserve - мне кажется не лучший вариант- лучше создать уже готовый массив - будет быстрее.
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.

Да но для больших файлов - убивает комп.... т.е. подвешивает его. Поэтому я предпочитаю построчное чтение :)
SvetaS, а чем Вам мой вариант из прошлой темы не подошел? из 31 - го сообщения?
PS:Неужели нельзя решать вопрос в одном месте, а не разрываться на части.
и правда - зачем???


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Воскресенье, 27.09.2015, 14:56
 
Ответить
Сообщение
"Теоретически", в вышеприведенных примерах чтение не построчное, а всего файла целиком.

1-й пример - построчный, но
ReDim Preserve - мне кажется не лучший вариант- лучше создать уже готовый массив - будет быстрее.
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.

Да но для больших файлов - убивает комп.... т.е. подвешивает его. Поэтому я предпочитаю построчное чтение :)
SvetaS, а чем Вам мой вариант из прошлой темы не подошел? из 31 - го сообщения?
PS:Неужели нельзя решать вопрос в одном месте, а не разрываться на части.
и правда - зачем???

Автор - SLAVICK
Дата добавления - 27.09.2015 в 14:55
SvetaS Дата: Воскресенье, 27.09.2015, 15:33 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 44
Репутация: -10 ±
Замечаний: 80% ±

Excel 2013
SLAVICK, и Вам огромное спасибо, всё подошло, я просто ещё учусь, а задача большая и вопросов много. (я ещё не уходила с той темы.....)
 
Ответить
СообщениеSLAVICK, и Вам огромное спасибо, всё подошло, я просто ещё учусь, а задача большая и вопросов много. (я ещё не уходила с той темы.....)

Автор - SvetaS
Дата добавления - 27.09.2015 в 15:33
Мир MS Excel » Вопросы и решения » Вопросы по VBA » быстрое считывание файла *.csv в массив 300 000 строк () (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!