Страницы: 1
RSS
сохранение *xls в *csv =строка на выходе в кавычках, можно ли обойти?, если в исходной строке есть запятая, то вся строка заключается в двойные кавычки. Как-то это можно обойти?
 
Добрый день!
Давно читаю форум, из разряда самоучек )) много полезного почерпнула, но столкнулась с вопросом, решить который не могу. Набралась смелости, решила совета попросить?
Мучаю файл: нужно из текстового файла выбрать определенные столбцы с данными и записать их в другой текстовый файл плюс добавить шапку, в которой посчитаны количество строк исходного файла, сумма одного столбца, максимум/минимум даты в третьем столбце. Конечный результат должен быть в DOS-кодировке, разделитель - точка с запятой. xlText сохранял с разделителем "запятая", пришла к xlCSV.
Столкнулась с проблемой: все работает нормально, НО если в исходной строке есть запятая, то вся строка заключается в двойные кавычки. Как-то это можно обойти? Подскажите, пожалуйста?.. Во вложении пример исходного файла и макрос.
 
Задача противоположная Вашей. Инвертируйте.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, спасибо за вариант! В нем добавляются кавычки. Если мне пойти от обратного и сохраненный файл перезаписать, заменив кавычки на что? на пустоту можно заменить? Потому что другой символ тоже не подойдет.
У меня же не всегда строки заключаются в кавычки, а только тогда, в значении которых есть запятая. Если запятой нет, то строка записывается нормально.
Сохранять не xlCSV, а xlText - тогда ухожу от этой проблемы, но приобретаю новую - разделитель - не точка-с-запятой... Прописать принудительно разделитель при сохранении не могу, мозгов не хватает )))))
В общем, мучаюсь и спотыкаюсь )))) наверное, решение какое-то простое, а я его просто не вижу...
 
Ну а просто конкатенацию использовать вручную?
There is no knowledge that is not power
 
Johny, да, таким образом строку и записываю в новый файл.
Код
i = 1
      For i = 1 To N_Saldo
        Reestr.Sheets(1).Range("A" + Trim(Str(i))).Value = Saldo.Sheets(1).Range(FIO_Col_Saldo + Trim(Str(i))).Value & Chr(59) & Saldo.Sheets(1).Range(DS_Col_Saldo + Trim(Str(i))).Value & Chr(59) & Saldo.Sheets(1).Range(Sum_Col_Saldo + Trim(Str(i))).Value & ".00" & Chr(59) & Replace(Format(Saldo.Sheets(1).Range(Date_Col_Saldo + Trim(Str(i))).Value, ddmmyy), ".", "/")
      Next i

и в атрибуте "DS_Col_Saldo"  в исходнике бывают значения типа школа, 25 - и тогда строчка - в двойные кавычки. Это, как я почитала, особенность сохранения в текстовые файлы, вот как ее обойти?
Изменено: MariaVS - 01.12.2015 13:20:21
 
Вот пример:
Код
Sub FFF()

    Dim r
    Dim fso As Object
    Dim txt As Object
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txt = fso.CreateTextFile("C:\Temp\1.csv", Overwrite:=True)
    
    For r = 1 To 10
        txt.WriteLine "Школа, 25;Школа 39;Школа, 50;"
    Next

    txt.Close
    
End Sub

Путь к файлу только поменяйте. В итоге получаем CSV файл, который нормально открывается экселем - с разбивкой.
There is no knowledge that is not power
 
Johny, вся беда в том, что конечные *.txt открываться будут не всеядным экселем, а 1С, заточенной под загрузку файла с определенной структурой.. ((( И если я уберу запятые в наименовании школа, 25 и получу на выходе школа 25, то конечный файл не загрузится. Надо на выходе получить текстовую строку (кодировка ms-dos) без пробелов с разделителем ";". Строку получаю, но в кавычках... Либо без кавычек, но с пробелами между ";" (пробовала не конкатенацией строку записывать, а столбцами, между столбцами с данными в пустой столбец сохраняла точку с запятой и потом сохраняла в текст. Тогда появлялись пробелы в строке между сохраненными столбцами, которые Trim_ом не убирались %-/)  В общем, измудрялась как могла, и не могла, и вас всех зря мучаю...
 
Тогда вам нужно приложение на C# написать - там можно кодировки какие угодно указывать. :)
There is no knowledge that is not power
 
Johny, а так хотелось обойтись всемогущим vba ))))))  эх... "орешек знаний тверд..."  (с)
 
Добрый день. Наверное многое зависит от машины и ПО, у меня Ваш вариант и код Johny выдают результаты без кавычек.
попробуйте следующий вариант, может поможет:
Код
Dim r
Dim record As String
Open "C:\Users\SP\Desktop\1.csv" For Output As #1 
    For r = 13 To 23 
        record = "" & Range("B" & r & "") & ";" & Range("C" & r & "") & "" 
        Print #1, record
    Next
 Close #1
 
MariaVS, кодировка - поиск по форуму.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan, Johny, egonomist, спасибо вам, коллеги!  Да, все получилось по коду Jonny (:  Спасибо большое! Первое мое обращение, я верила, что мне помогут, ура!!!! Спасибо!!!
Страницы: 1
Наверх