Страницы: 1
RSS
Отображение данных в создаваемом .csv
 
Прошу объяснить нехорошее поведение то ли данных, то ли формата файла.

Создаю программно .csv файл трех разных видов:
Код
Sub СreateCSV()
Dim ArrData
Dim sPath As String
    ArrData = Range("A2:C5").Value
    sPath = ThisWorkbook.Path & "\"
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "док", FileFormat:=xlCSVMSDOS, CreateBackup:=False
        .Close
    End With
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "мак", FileFormat:=xlCSVMac, CreateBackup:=False
        .Close
    End With
    
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "разд", FileFormat:=xlCSV, CreateBackup:=False
        .Close
    End With
End Sub
С DOS  понятно - кириллицу не видит, рисует "кракозяблики".
CSVMac преобразовывает одну букву "я" - делает ее большой, "Ковровое" пишет ""Љовровое". Не родное, ясно.

Больше других подходит формат файла "разделители-запятые". Но и тут не все гладко.
Числа в исходных данных сохранены как текст. Если число не целое, с запятой, в .csv вставляется с кавычками, как текст (в примере число 2,5). То же с текстом, в котором есть числа, например:
Ковровое 4142 - 3,0 м/10,0/5,0 мм вставляется с кавычками. Прошу объяснить, почему так. Как быть, на каком этапе  менять?
 
Экранирует запятые в данных от запятых как разделителя.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
И точно. Спасибо. Даже мысли не было, зацепился за цифры.
 
Есть ли возможность заменить разделитель на точку с запятой?
 
:) как ни странно, у меня разделитель ; и в CSV-DOS, и в обычном.
F1 творит чудеса
 
В файлах разделитель - столбцы :)
А моим кодом попробовать?
 
Мелкий, с тебя 7 стаканов красного.   :*  
Код
    With Workbooks.Add
        .Sheets(1).Cells(1, 1).Resize(4, 3).Value = ArrData
        .SaveAs Filename:=sPath & "разд_1", FileFormat:=xlCSV, CreateBackup:=False, Local:=True
        .Close False
    End With
 
Я так пробовал - в английской версии не катит.
Я бы делал как у Игоря на сайте - всё в массив, его в цикле в текст с нужным разделителем.
 
Цитата
...с тебя 7 стаканов красного.
Разбросало по столбцам.
Бойтесь жадных котов, да еще и пьющих! Да еще у кого такое просить надумал? У дитяти!!!
Это за один-то параметр (ну, плюс единичка в названии файла). Нет бы, молочка попросил...
А вообще: если чё, заходи  :)  

По поводу массива - вот же, дубина: я ведь данные сам формирую, массивом (это в примере просто, на деле -  выборка из разных столбцов). Объединить сразу в один столбец!
Спасибо.
 
Не за один. За два! Единичка - бонус. :)
 
Я вот примерно про это говорил:
http://excelvba.ru/code/Range2CSV

Хотя я помнится формировал строки и писал их последовательно в файл. Особенно если строк будет много думаю так лучше.
Изменено: Hugo - 20.08.2014 16:44:39
 
Спасибо, Игорь.
формирую кучу файлов со строками из трех  значений: данных ячейки фиксированного столбца, заголовка искомого столбца и данных ячейки этого столбца. Строки формирую в массиве. Но  не догадался писать сразу через любой выбранный разделитель, запоминал строку в трех столбцах массива.
 
Я бы + ко всему (программной записи в файл), добавил бы еще и ограничитель текста. Это спасет от подводных камней при импорте такого файла. Т.е типа такого:
Код
"123","Привет, Вася","456"
 
Не понял про ограничитель.
При создании .csv текст с запятыми сам  обрамляется кавычками (см. сообщение №2).
 
это если использовать создание файла средствами excel, а если полностью сами тогда кто, кроме Вас, это сделает :)
 
Нет, создание из VBA, обрамление текста с запятыми есть. Не в коде - оно само есть :)
 
Виктор Вы меня не правильно поняли.

Код
 .SaveAs Filename
Это метод excel.application


Код
FSO.Write
Это метод scripting.filesystemobject
---------------
В первом случае все делает excel
во втором filesystemobject
----------------
В первом случае excel может не всегда правильно создать файл csv.
Как правило csv это промежуточный файл экспорта импорта различных приложений.
В разных приложениях применяются разные способы чтения csv файлов. Соответственно программы интерпретируют по разному ту или иную комбинацию символов, для формирования правильного набора данных. Для того чтобы избежать разночтений набора данных в таких файлах из за присутствия в них символов разделяющих столбцы, применяют ограничитель текста. По ссылке что привел Hugo, во втором варианте функции Educatedful (Игорь), как раз и используется ограничитель текста.  
 
Теперь понял. Спасибо. Буду изучать.
 
B.Key, хочу уточнить, правильно ли я понял?
Вариант "1232";"12,55";"12" прочитается правильно всегда? даже если программа выгружает файл в формате 1232;12,55;12 ? Или все же нужно возвращать в том же формате, что и исходник?
 
Код
Вариант "1232";"12,55";"12" прочитается правильно всегда
При правильных настройках импорта, да.
----------
Зы..
формат csv, к сожалению не дает 100% гарантии правильного импорта данных
Страницы: 1
Наверх