Задача считать файл *.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 строк
Задача считать файл *.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]
но как вставить строку 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
Вариант, без использования сторонних компонентов. Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через 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]
Вариант, без использования сторонних компонентов. Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через 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
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.
Да но для больших файлов - убивает комп.... т.е. подвешивает его. Поэтому я предпочитаю построчное чтение SvetaS, а чем Вам мой вариант из прошлой темы не подошел? из 31 - го сообщения?
Быстродействие не проверял, но теоретически должно быть быстрее, чем построчное чтение из файла через FSO.
Да но для больших файлов - убивает комп.... т.е. подвешивает его. Поэтому я предпочитаю построчное чтение SvetaS, а чем Вам мой вариант из прошлой темы не подошел? из 31 - го сообщения?