Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сохранение в CSV / 13 сообщений из 13, страница 1 из 1
09.09.2008, 18:30
    #35530633
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
Подскажите, в чем проблема:
Написал макрос, который сохраняет файл в формат .CSV
При запуске его через меню, ALT+F8, сохраняется нормально, разделитель данных ";" точка с запятой
Повесил запуск макроса на кнопку на панели инструментов, так при запуске с кнопки разделитель "," запятая, что не подходит для дальнейшей обработки файла. В чем причина? Это лечится? Может, надо в явном виде атрибуты какие прописать?
Код: plaintext
1.
    ActiveWorkbook.SaveAs Filename:="C:\domino\1.csv", FileFormat:=xlCSVMSDOS, _
        CreateBackup:=False
...
Рейтинг: 0 / 0
09.09.2008, 19:34
    #35530734
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
Более вдумчивый поиск натолкнул на вот эту ссылку, похожий случай, но решения проблемы там нет и что дальше с этим делать не пойму
http://forum.ru-board.com/topic.cgi?forum=33&topic=3961&start=20

авторКасательно разделителя: похоже в твоем случае просто игнорируется разделитель, установленный ключем Format (=Delimited(;)) раздела HKEY_LOCAL_MACHINE\software\Microsoft\jet\4.0\engines\text реестра.
Да и не было, по-моему, конкретной определенности по поводу разделителя в csv-файлах. Вроде в версиях выше XP жестко остановились на ";". Описанное тобой явление может быть отголоском этих разногласий.
...
Рейтинг: 0 / 0
09.09.2008, 19:42
    #35530745
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
Вообще-то, точку с запятой использовать неверно. Стандарт это запятая.
Гугли RFC 4180 и читай пункт 2.4

А Эксель (2003) знает несколько CSV форматов:
xlCSV

xlCSVMac

xlCSVMSDOS

xlCSVWindows
поэксперементируй с ними, какой лучше тебе подойдет.
...
Рейтинг: 0 / 0
09.09.2008, 20:09
    #35530780
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
CSV = Comma Separated Value(s) - значения, разделенные запятыми .
...
Рейтинг: 0 / 0
10.09.2008, 15:55
    #35532282
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
White OwlВообще-то, точку с запятой использовать неверно. Стандарт это запятая.
Гугли RFC 4180 и читай пункт 2.4
я знаю, но у меня база данных запятые не воспринимает почему-то, импортирует только если точка с запятой разделитель. так оно и получается точка с запятой, но вот если запуск макроса на кнопку привязать, то не получается почему-то, хотя макрос один и тот же

White Owl
А Эксель (2003) знает несколько CSV форматов:
xlCSV

xlCSVMac

xlCSVMSDOS

xlCSVWindows
поэксперементируй с ними, какой лучше тебе подойдет.


уже. не помогает. оно вроде только на кодировку влияет, если текст сохранять. Эксель правда 2000, но там тоже это есть.
Я вот думаю, может, какой ключик специальный существует, чтобы в лоб прописать, какие разделители использовать, но в справке по VBA этого нет.
...
Рейтинг: 0 / 0
10.09.2008, 17:41
    #35532631
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
Может я чего не понимаю. Почему автор одновременно говорит о формате CSV и о разделителе ";". Одно другое должно исключать. Наличие такого разделителя не есть формат CSV. То есть можно воспользоваться (как заклинанием) форматом xlCSVMSDOS, но разделение данных будет осуществляться по запятым, а не по точкам с запятой.

Если надо импортировать в Excel, то дайте файлу расширение "txt" и запишите макро, указывающее разделитель ";": File/Open и т.д.
...
Рейтинг: 0 / 0
10.09.2008, 17:47
    #35532644
VladConn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
И еще: что это у вас за база данных такая? Если это Excel, то так и надо сказать, а если это действительно база данных, а не Excel, то какая?
...
Рейтинг: 0 / 0
10.09.2008, 18:23
    #35532733
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
VladConnМожет я чего не понимаю. Почему автор одновременно говорит о формате CSV и о разделителе ";". Одно другое должно исключать. Наличие такого разделителя не есть формат CSV. То есть можно воспользоваться (как заклинанием) форматом xlCSVMSDOS, но разделение данных будет осуществляться по запятым, а не по точкам с запятой.

Если надо импортировать в Excel, то дайте файлу расширение "txt" и запишите макро, указывающее разделитель ";": File/Open и т.д.
И еще: что это у вас за база данных такая? Если это Excel, то так и надо сказать, а если это действительно база данных, а не Excel, то какая?


Ну я не знаю как еще объяснить... может это фича такая в экселе, но если я через меню выбираю команду Файл- сохранить как - тип файла=.csv (разделители запятые) то сохраняется файл с разделителем ";" :) эксель 2000, в 97м то же самое. Может потому, что в региональных стандартах так задано, может, еще почему... То же самое действие, записанное в макрос, дает такой же результат. А вот тот же самый макрос, запускаемый кнопкой на панели инструментов дает результат "," В последующем данный файл импортируется в бд "Домино", где функция импорта на ";" заточена.
а я хочу все-таки этот макрос с кнопки запустить, что бы и так и так работало. За неимением доступного формата xlCDSV (Comma Dot Separated Value) :) приходится как-то через xlCSV изворачиваться.

Чтобы меня сильно не пинали... я не программист, а простой менеджер, пытаюсь оптимизировать свои рабочие процедуры. Спрашивал у нашего админа-программиста, почему так происходит - он глубокомысленно пожал плечами и сказал "не знаю". он по VBA вообще не сечет
...
Рейтинг: 0 / 0
10.09.2008, 18:44
    #35532768
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
kabanchegЗа неимением доступного формата xlCDSV (Comma Dot Separated Value) :)Тогда уж xlSSV. Знак пунктуации "точка с запятой" по английски называется "semicolon".

Хочешь универсальности - реализуй сохранение данных в файл самостоятельно. Либо прогоняй полученный файл через дополнительный конвертор который превратит "неправильный" разделитель полей в "правильный".
...
Рейтинг: 0 / 0
11.09.2008, 10:57
    #35533444
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
Вообще-то все очень несложно.
Рекомендую почитать здесь: http://msdn.microsoft.com/en-us/library/ms709353.aspx
...
Рейтинг: 0 / 0
12.09.2008, 19:06
    #35537217
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
AndrFВообще-то все очень несложно.
Рекомендую почитать здесь: http://msdn.microsoft.com/en-us/library/ms709353.aspx
Почитал. Не совсем понял, поясните плз: этот Schema.ini используется для непосредственного импорта в базу данных что ли? т.е. в исходном файле разделители могут быть любыми, а при импорте меняются как бы на лету?
...
Рейтинг: 0 / 0
12.09.2008, 19:16
    #35537225
kabancheg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
о_О а я неделю мучаюсь. Дошло. А все надо было проще гораздо....
Сцепить эти колонки просто в одну с разделителем, каким мне надо, и всего делов.
...
Рейтинг: 0 / 0
15.09.2008, 10:38
    #35538945
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение в CSV
kabanchegПочитал. Не совсем понял, поясните плз: этот Schema.ini используется для непосредственного импорта в базу данных что ли? т.е. в исходном файле разделители могут быть любыми, а при импорте меняются как бы на лету?

Schema.ini задает параметры экспорта/импорта. В том числе может задавать и разделитель, кодовую страницу файла, имена полей...

Ниже примерчик, который я когда-то набрасывал:

Код: plaintext
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.
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 [игнор отключен] [закрыт для гостей] / Сохранение в CSV / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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