Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADODB.Stream: метода Open не работает с аргументами / 16 сообщений из 16, страница 1 из 1
04.12.2019, 14:05
    #39898090
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Хочу открыть текстовый файл со специфической кодировкой. Поэтому не подходит Scripring.FileSystemObject, а использую ADODB.Stream. Не хочу затягивать файл в память целиком, поэтому не годится комбинация из Open без аргументов и последующим LoadFromFile.

Допустим, делаю это в VBA:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Dim S As ADODB.Stream
Set S = New ADODB.Stream
S.Mode = adModeRead
S.Type = adTypeText
S.Charset = "UTF-8"
'S.Open "C:\Temp\shit.txt"
'S.Open "URL=file://C:\Temp\shit.txt"
'S.Open "URL=file:///C:\Temp\shit.txt"



Ни один из закомментированных вариантов не работает. Как использовать этот чёртов метод с аргументом, но не типа Record? В документации сказано:

ДокументацияStream.Open Source, Mode , OpenOptions, UserName, Password
Parameters

Source
Optional. A Variant value that specifies the source of data for the Stream. Source may contain an absolute URL string that points to an existing node in a well-known tree structure, such as an e-mail or file system.
...
Рейтинг: 0 / 0
04.12.2019, 14:22
    #39898103
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Код: vbnet
1.
'S.Open "URL=file:///C:/Temp/shit.txt"

может так?
...
Рейтинг: 0 / 0
04.12.2019, 14:30
    #39898108
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
...
Рейтинг: 0 / 0
04.12.2019, 15:03
    #39898138
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Shocker.Pro,

Вы всегда даёте ответ, не поняв вопрос?
Я специально минимизировал количество кода и моих комментариев.
...
Рейтинг: 0 / 0
04.12.2019, 15:13
    #39898147
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Konst_One,

Большое спасибо.
Жаль, что в описании метода Open использовано туманное выражение "well-known tree structure, such as an e-mail or file system".
...
Рейтинг: 0 / 0
04.12.2019, 15:23
    #39898154
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Андрей Усачёв
Вы всегда даёте ответ, не поняв вопрос?
Я специально минимизировал количество кода и моих комментариев.
Что не так в моем ответе. Я предложит попробовать тот вариант, которого у вас не было.
...
Рейтинг: 0 / 0
04.12.2019, 15:27
    #39898157
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim S As ADODB.Stream
Set S = New ADODB.Stream
S.Open
S.Type = adTypeText
S.CharSet = "UTF-8"
S.LoadFromFile "c:/tmp/x1.txt"
Debug.Print S.ReadText
...
Рейтинг: 0 / 0
04.12.2019, 15:39
    #39898164
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Shocker.Pro,

Извините, не заметил, что вы заменили символы "\" на "/".
Но это я тоже пробовал. Все известные мне программы не различают эти символы в URL.
...
Рейтинг: 0 / 0
04.12.2019, 15:40
    #39898166
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Akina,

А вы точно даже 1-й абзац моего исходного сообщения не прочитали.
...
Рейтинг: 0 / 0
04.12.2019, 16:33
    #39898203
Dino_zavr
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Андрей Усачёв,
А библиотеку подключили???
...
Рейтинг: 0 / 0
04.12.2019, 17:43
    #39898260
Андрей Усачёв
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Dino_zavr,

Компьютер включил, любую программу MS Office запустил, Alt+F11 нажал, библиотеку подключил, модуль создал, в модуле процедуру/функцию создал, текст программы ввёл (вот об этом я написал), F5 нажал — ну или кнопку запуска нажал. Я стараюсь не писать об очевидном, чтобы потенциальным помощникам было легче читать.
...
Рейтинг: 0 / 0
04.12.2019, 20:10
    #39898304
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Андрей Усачёв
А вы точно даже 1-й абзац моего исходного сообщения не прочитали.
Прочитал. И не понимаю, откуда Вы взяли, что LoadFromFile "затягивает файл в память целиком" - это же бред чистой воды... откройте реально большой файл, не влезающий в оперативку - ведь откроется же, не свалится с воплями, что памяти нехватает.
...
Рейтинг: 0 / 0
05.12.2019, 11:37
    #39898487
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Akina,

откроет целиком и свалится в своп.

PS
мне в итоге пришлось отказаться от стрима и вернуться к FileSystemObject с посимвольным чтением.
и не потому, что стрим читает файл целиком, а потому что в некий момент стрим был объявлен опасным,
и вбскрипт, запускаемый из-под сервиса, получал отказ в создании объекта.
ридфайл туда не приделывался, а рулить правами на стрим при установке сервиса было признано неприемлемым...
...
Рейтинг: 0 / 0
05.12.2019, 11:41
    #39898493
booby
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
booby
Akina,

откроет целиком и свалится в своп.

PS
мне в итоге пришлось отказаться от стрима и вернуться к FileSystemObject с посимвольным чтением.
и не потому, что стрим читает файл целиком, а потому что в некий момент стрим был объявлен опасным,
и вбскрипт, запускаемый из-под сервиса, получал отказ в создании объекта.
ридфайл туда не приделывался, а рулить правами на стрим при установке сервиса было признано неприемлемым...


кстати, подозреваю, что при использовании интернет паблишин провайдер будет происходить то же самое
- достаточно неожиданно было бы, если бы урл читался частями
Подозреваю, что поток всегда получается целиком.
После чего ты читаешь его любимым методом.
...
Рейтинг: 0 / 0
05.12.2019, 11:59
    #39898510
court
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
тут Read large file line-by-line with ADO Stream? через рекордсет предлагают ...
...
Рейтинг: 0 / 0
09.01.2020, 11:16
    #39911905
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADODB.Stream: метода Open не работает с аргументами
Полезные ссылочки на тему:
http://msdn.microsoft.com/en-us/library/ms709353.aspx
http://msdn.microsoft.com/en-us/library/ms974559.aspx

Ну и пример:

--------------------------------

Код: 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.
81.
82.
83.
Public Sub Main()
    Const sPathIn As String = "C:\Temp\"
    Const sPathOut As String = "C:\Temp\"
    Const sFileIn As String = "File.txt"
    Const sFileOut As String = "NewFile.txt"

    Dim cn As New ADODB.Connection, r As New ADODB.Recordset, _
        s As String, ss As String, sSchemaIni As String, i As Integer

    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & sPathIn & ";" & _
          "Extended Properties=Text"

    ' Создадим файл откуда берем данные для теста
    For i = 0 To 100
        s = Mid$(Format$(Rnd, ".0000000"), 2)
        ss = ss & Mid$(s, 1, 1) & "," & Mid$(s, 2, 1) & "," & Mid$(s, 3, 1) & "." & CInt(Mid$(s, 4, 3)) & "," & Mid$(s, 7, 1) & vbCrLf
    Next i
    s = sPathOut & sFileIn
    If FileExists(s) Then Kill s
    SaveFile s, ss
    
    ' Удалим выходной файл
    s = sPathOut & sFileOut
    If FileExists(s) Then Kill s
    
    ' Создадим schema.ini
    sSchemaIni = sPathOut & "schema.ini"
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    ss = "[File.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf _
        & vbCrLf _
        & "[NewFile.txt]" & vbCrLf _
        & "ColNameHeader=False" & vbCrLf _
        & "CharacterSet=1251" & vbCrLf _
        & "Format=Delimited(,)" & vbCrLf _
        & "DecimalSymbol=." & vbCrLf _
        & "NumberDigits=4" & vbCrLf _
        & "Col1=F1 Integer" & vbCrLf _
        & "Col2=F2 Integer" & vbCrLf _
        & "Col3=F3 Float" & vbCrLf _
        & "Col4=F4 Integer" & vbCrLf
        
    SaveFile sSchemaIni, ss
    
    ' Импортируем данные
    On Error GoTo Err_
    r.Open "SELECT * INTO [" & sFileOut _
                    & "] IN '" & sPathOut & "' [Text;] " _
            & "FROM [" & sFileIn _
            & "] ORDER BY 1,2,3,4", cn, _
                    adOpenStatic, adLockReadOnly, adCmdText
    If FileExists(sSchemaIni) Then Kill sSchemaIni
    Exit Sub

Err_:
    With cn.Errors(0)
        If .NativeError = -329323426 And .Number = -2147467259 Then Resume Next
    End With
    MsgBox Err.Description, vbCritical
End Sub

Private Function FileExists(sFile As String) As Boolean
    On Error Resume Next
    FileExists = ((GetAttr(sFile) And vbDirectory) = 0)
    If Err.Number Then Err.Clear
End Function

Private Sub SaveFile(sFile As String, sText As String)
    Dim iHFile As Integer
    
    iHFile = FreeFile
    Open sFile For Binary As #iHFile
    Put iHFile, , sText
    Close #iHFile
End Sub
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADODB.Stream: метода Open не работает с аргументами / 16 сообщений из 16, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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