Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Правильное открытие CSV файла - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Правильное открытие CSV файла (Макросы/Sub)
Правильное открытие CSV файла
Poltava Дата: Вторник, 03.04.2018, 00:05 | Сообщение № 1
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Доброго времени суток всем.
Не могу победить 1 проблему. При открытии CSV файла двойным кликом все хорошо но при попытке открытия уже из самого экселя он предлагает сделать настройки импорта CSV после чего структура файла разваливается. Я так и не смог подобрать подходящих настоек хотя при двойном нажатии по файлу в проводнике эксель сам распознает все необходимые настройки к тому же правильно!

Вот пример правильного.


и непровильного
К сообщению приложен файл: post68449648.csv (3.7 Kb)
 
Ответить
СообщениеДоброго времени суток всем.
Не могу победить 1 проблему. При открытии CSV файла двойным кликом все хорошо но при попытке открытия уже из самого экселя он предлагает сделать настройки импорта CSV после чего структура файла разваливается. Я так и не смог подобрать подходящих настоек хотя при двойном нажатии по файлу в проводнике эксель сам распознает все необходимые настройки к тому же правильно!

Вот пример правильного.


и непровильного

Автор - Poltava
Дата добавления - 03.04.2018 в 00:05
Roman777 Дата: Вторник, 03.04.2018, 09:26 | Сообщение № 2
Группа: Проверенные
Ранг: Ветеран
Сообщений: 980
Репутация: 127 ±
Замечаний: 0% ±

Excel 2007, Excel 2013
Poltava, Не знаю тоже с чем связана такая разница, но если из экселя зажимая шифт будем открывать, так же откроется как Вам надо...
Судя по тому, как выглядит импортнутый файл из csv, мне кажется, что обычная вставка с разделителями не позволит алгоритму вставить нужные поля в нужные ячейки...


Много чего не знаю!!!!

Сообщение отредактировал Roman777 - Вторник, 03.04.2018, 09:37
 
Ответить
СообщениеPoltava, Не знаю тоже с чем связана такая разница, но если из экселя зажимая шифт будем открывать, так же откроется как Вам надо...
Судя по тому, как выглядит импортнутый файл из csv, мне кажется, что обычная вставка с разделителями не позволит алгоритму вставить нужные поля в нужные ячейки...

Автор - Roman777
Дата добавления - 03.04.2018 в 09:26
KuklP Дата: Вторник, 03.04.2018, 09:46 | Сообщение № 3
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
По сути это не CSV файл. Это какой-то HTML. Поэтому Экс расшифровывает его как ему вздумается.
Цитата
CSV — Википедия
https://ru.wikipedia.org/wiki/CSV
CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация: Каждая строка файла — это одна строка таблицы. Разделителем (англ. delimiter) значений колонок является символ запятой ( , ).


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеПо сути это не CSV файл. Это какой-то HTML. Поэтому Экс расшифровывает его как ему вздумается.
Цитата
CSV — Википедия
https://ru.wikipedia.org/wiki/CSV
CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация: Каждая строка файла — это одна строка таблицы. Разделителем (англ. delimiter) значений колонок является символ запятой ( , ).

Автор - KuklP
Дата добавления - 03.04.2018 в 09:46
SLAVICK Дата: Вторник, 03.04.2018, 10:46 | Сообщение № 4
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Это какой-то HTML.

Да - это тегированная таблица, хотя и в CSV. Тут вот описана похожая ситуация.
Когда- то тоже с таким сталкивался.
Excel - понимает, что это таблица - и автоматически ее преобразовывает. Тот же результат будет если открыть блокнот, скопировать весь текст и вставить в Excel.

Если использовать импорт при помощи Csv.Document в PowerQuery - то можно добиться нужного результата:
К сообщению приложен файл: 333.xlsx (25.5 Kb)


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Это какой-то HTML.

Да - это тегированная таблица, хотя и в CSV. Тут вот описана похожая ситуация.
Когда- то тоже с таким сталкивался.
Excel - понимает, что это таблица - и автоматически ее преобразовывает. Тот же результат будет если открыть блокнот, скопировать весь текст и вставить в Excel.

Если использовать импорт при помощи Csv.Document в PowerQuery - то можно добиться нужного результата:

Автор - SLAVICK
Дата добавления - 03.04.2018 в 10:46
Poltava Дата: Среда, 04.04.2018, 00:17 | Сообщение № 5
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Roman777, Спасибо действительно при зажатом шифте открывается так же как и при двойном клике но меня интересует именно программная обработка.

KuklP, Очень уважаю Ваше экспертное мнение, но все же файл полностью соответствует спецификации CSV файла. Это видно во первых из того что Ексель все же при двойном клике правильно открывает файл, во вторых то что вас смутило это действительно исходный код HTML который таким и должен остаться. но с точки зрения спецификации CSV это просто очередное значение разделенное разделителями и взятое в "" как содержащие зарезервированные символы. Так что чисто теоретически эксель должен бы его распознавать и очевидно что он это может в автоматическом режиме он с этим прекрасно справляется. Вопрос как это повторить программно.

SLAVICK, Спасибо интересный пример обязательно возьму на заметку но он не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML кодом что по сути обычный текст.

Сделал вывод что нужно писать свою функцию по импорту сложных CSV так как изучая уже более двух дней данную тему так и не смог найти решения казалось бы банальной задачи стандартными средствами. Попробую реализовать и тогда выложу тут что получиться.
 
Ответить
СообщениеRoman777, Спасибо действительно при зажатом шифте открывается так же как и при двойном клике но меня интересует именно программная обработка.

KuklP, Очень уважаю Ваше экспертное мнение, но все же файл полностью соответствует спецификации CSV файла. Это видно во первых из того что Ексель все же при двойном клике правильно открывает файл, во вторых то что вас смутило это действительно исходный код HTML который таким и должен остаться. но с точки зрения спецификации CSV это просто очередное значение разделенное разделителями и взятое в "" как содержащие зарезервированные символы. Так что чисто теоретически эксель должен бы его распознавать и очевидно что он это может в автоматическом режиме он с этим прекрасно справляется. Вопрос как это повторить программно.

SLAVICK, Спасибо интересный пример обязательно возьму на заметку но он не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML кодом что по сути обычный текст.

Сделал вывод что нужно писать свою функцию по импорту сложных CSV так как изучая уже более двух дней данную тему так и не смог найти решения казалось бы банальной задачи стандартными средствами. Попробую реализовать и тогда выложу тут что получиться.

Автор - Poltava
Дата добавления - 04.04.2018 в 00:17
SLAVICK Дата: Среда, 04.04.2018, 10:44 | Сообщение № 6
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML

да тут просмотрел - действительно сбило с толку содержание с HTML.
меня интересует именно программная обработка.

А какой у Вас офис? - мой пример файла смотрели - там импорт в PowerQuery сделан - корректно.
[vba]
Код
let
    Источник = Csv.Document(File.Contents("C:\Users\y.popov\Downloads\post68449648.csv"),[Delimiter=";",Encoding=65001]),
    #"Повышенные заголовки" = Table.PromoteHeaders(Источник)
in
    #"Повышенные заголовки"
[/vba]
У вас в файле - разделитель точка с запятой, но проблема в том что есть значения, которые имеют перенос строки - именно он все портит.
Видимо при авто открытии - excel - это все учитывает, а при обычном импорте - такой возможности не нашел.
Тут вот похожая тема обсуждалась.

накрапал макрос для импорта:
[vba]
Код
Sub d()
    Dim objStream, strData$, FileN$, arr, arr1, arrF, i&, ii&
    FileN$ = "c:\Users\y.popov\Downloads\post68449648.csv"
    
    Set objStream = CreateObject("ADODB.Stream")
    
    objStream.Charset = "utf-8"
    objStream.Open
    objStream.LoadFromFile (FileN)
    strData = objStream.ReadText()
    objStream.Close
    arr = Split(strData, Chr(13) & Chr(10) & """", , vbTextCompare)
    arr1 = Split(arr(0), ";")
    ReDim arrF(LBound(arr) To UBound(arr), LBound(arr1) To UBound(arr1))
    
    For i = LBound(arrF) To UBound(arrF)
    arr1 = Split(arr(i), """;""")
        For ii = LBound(arr1) To UBound(arr1)
'        If ii = UBound(arr1) Then Stop
        If ii = LBound(arr1) Then arr1(ii) = Right(arr1(ii), Len(arr1(ii)) - IIf(i = LBound(arrF), 1, 0))
        If ii = UBound(arr1) Then arr1(ii) = Left(arr1(ii), Len(arr1(ii)) - IIf(i = UBound(arrF), 3, 1))
        arrF(i, ii) = arr1(ii)
        Next
    Next
    [a1].Resize(UBound(arrF) + 1, UBound(arrF, 2) + 1) = arrF
End Sub
[/vba]
К сообщению приложен файл: csvImport_1.xlsm (24.5 Kb)


Иногда все проще чем кажется с первого взгляда.

Сообщение отредактировал SLAVICK - Среда, 04.04.2018, 11:04
 
Ответить
Сообщение
не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML

да тут просмотрел - действительно сбило с толку содержание с HTML.
меня интересует именно программная обработка.

А какой у Вас офис? - мой пример файла смотрели - там импорт в PowerQuery сделан - корректно.
[vba]
Код
let
    Источник = Csv.Document(File.Contents("C:\Users\y.popov\Downloads\post68449648.csv"),[Delimiter=";",Encoding=65001]),
    #"Повышенные заголовки" = Table.PromoteHeaders(Источник)
in
    #"Повышенные заголовки"
[/vba]
У вас в файле - разделитель точка с запятой, но проблема в том что есть значения, которые имеют перенос строки - именно он все портит.
Видимо при авто открытии - excel - это все учитывает, а при обычном импорте - такой возможности не нашел.
Тут вот похожая тема обсуждалась.

накрапал макрос для импорта:
[vba]
Код
Sub d()
    Dim objStream, strData$, FileN$, arr, arr1, arrF, i&, ii&
    FileN$ = "c:\Users\y.popov\Downloads\post68449648.csv"
    
    Set objStream = CreateObject("ADODB.Stream")
    
    objStream.Charset = "utf-8"
    objStream.Open
    objStream.LoadFromFile (FileN)
    strData = objStream.ReadText()
    objStream.Close
    arr = Split(strData, Chr(13) & Chr(10) & """", , vbTextCompare)
    arr1 = Split(arr(0), ";")
    ReDim arrF(LBound(arr) To UBound(arr), LBound(arr1) To UBound(arr1))
    
    For i = LBound(arrF) To UBound(arrF)
    arr1 = Split(arr(i), """;""")
        For ii = LBound(arr1) To UBound(arr1)
'        If ii = UBound(arr1) Then Stop
        If ii = LBound(arr1) Then arr1(ii) = Right(arr1(ii), Len(arr1(ii)) - IIf(i = LBound(arrF), 1, 0))
        If ii = UBound(arr1) Then arr1(ii) = Left(arr1(ii), Len(arr1(ii)) - IIf(i = UBound(arrF), 3, 1))
        arrF(i, ii) = arr1(ii)
        Next
    Next
    [a1].Resize(UBound(arrF) + 1, UBound(arrF, 2) + 1) = arrF
End Sub
[/vba]

Автор - SLAVICK
Дата добавления - 04.04.2018 в 10:44
KuklP Дата: Среда, 04.04.2018, 17:46 | Сообщение № 7
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
файл полностью соответствует спецификации CSV файла
:) Только мы с эксом и википедией считаем иначе.
Цитата
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML).
HTML — Википедия
Цитату о "CSV — текстовый формат" я приводил выше. А теперь слово Эксу:

И да, HTML можно читать блокнотом, но умней это делать приспособленными программами ;)
К сообщению приложен файл: 0314261.gif (16.0 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Среда, 04.04.2018, 17:48
 
Ответить
Сообщение
файл полностью соответствует спецификации CSV файла
:) Только мы с эксом и википедией считаем иначе.
Цитата
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML).
HTML — Википедия
Цитату о "CSV — текстовый формат" я приводил выше. А теперь слово Эксу:

И да, HTML можно читать блокнотом, но умней это делать приспособленными программами ;)

Автор - KuklP
Дата добавления - 04.04.2018 в 17:46
SLAVICK Дата: Среда, 04.04.2018, 21:13 | Сообщение № 8
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
KuklP, Там действительно не HTML. Посмотрите мои вложения - там есть ячейки с кусками HTML(столбец J) - именно они и сбили с толку.
я тоже сначала подумал что это HTML - сохраненный с расширением CSV, но поспешил.
это действительно CSV, но с разделителем точка с запятой.
Кстати в той же статье есть дальше описание:
Цитата
Иные разделители
Большинство программ понимают под CSV более общий формат DSVruen (англ. delimiter-separated values — значения разделённые разделителем), допускающий использование иных символов в качестве разделителя. В частности, в русской и других локалях запятая по умолчанию зарезервирована под десятичный разделитель. Поэтому как разделитель используется точка с запятой или табуляция (формат TSV).
Несмотря на наличие RFC, на сегодняшний день под CSV, как правило, понимают набор значений, разделенных какими угодно разделителями, в какой угодно кодировке с какими угодно окончаниями строк. Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту реализации поддержки CSV.


Иногда все проще чем кажется с первого взгляда.
 
Ответить
СообщениеKuklP, Там действительно не HTML. Посмотрите мои вложения - там есть ячейки с кусками HTML(столбец J) - именно они и сбили с толку.
я тоже сначала подумал что это HTML - сохраненный с расширением CSV, но поспешил.
это действительно CSV, но с разделителем точка с запятой.
Кстати в той же статье есть дальше описание:
Цитата
Иные разделители
Большинство программ понимают под CSV более общий формат DSVruen (англ. delimiter-separated values — значения разделённые разделителем), допускающий использование иных символов в качестве разделителя. В частности, в русской и других локалях запятая по умолчанию зарезервирована под десятичный разделитель. Поэтому как разделитель используется точка с запятой или табуляция (формат TSV).
Несмотря на наличие RFC, на сегодняшний день под CSV, как правило, понимают набор значений, разделенных какими угодно разделителями, в какой угодно кодировке с какими угодно окончаниями строк. Это значительно затрудняет перенос данных из одних программ в другие, несмотря на всю простоту реализации поддержки CSV.

Автор - SLAVICK
Дата добавления - 04.04.2018 в 21:13
KuklP Дата: Среда, 04.04.2018, 22:34 | Сообщение № 9
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Там действительно не HTML. ... это действительно CSV, но с разделителем точка с запятой.
Ну тогда немного огорчу вас, други :)
[vba]
Код
Sub www(): Workbooks.Open Filename:="c:\Temp\post68449648.csv", Local:=True: End Sub
[/vba]

И фсьо.. B)
К сообщению приложен файл: 7311420.gif (10.5 Kb)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
Сообщение
Там действительно не HTML. ... это действительно CSV, но с разделителем точка с запятой.
Ну тогда немного огорчу вас, други :)
[vba]
Код
Sub www(): Workbooks.Open Filename:="c:\Temp\post68449648.csv", Local:=True: End Sub
[/vba]

И фсьо.. B)

Автор - KuklP
Дата добавления - 04.04.2018 в 22:34
Poltava Дата: Среда, 04.04.2018, 22:41 | Сообщение № 10
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

KuklP, Вы все верно пишите но подойдите к вопросу творчески! HTML это по сути обычный текст написанный определенным стандартом как и CSV. Так вот в моем случае это CSV 1 из столбцов которого содержит в себе текстовую строку, а кто сказал что текстовая строка не может содержать внутри себя HTML разметку!

SLAVICK, Долго писал подобную функцию пытаясь описать все возможные случаи но в итоге решил все проще с помощью двух строчек кода.
[vba]
Код
Set POpen = CreateObject("WScript.Shell")
POpen.Run "Путь_к_файлу"
[/vba]
Этот код повторяет действия пользователя равнозначные двойному щелчку мышкой по файлу. А как было сказано ранее в таком случае эксель корректно открывает файл.


Сообщение отредактировал Poltava - Среда, 04.04.2018, 22:47
 
Ответить
СообщениеKuklP, Вы все верно пишите но подойдите к вопросу творчески! HTML это по сути обычный текст написанный определенным стандартом как и CSV. Так вот в моем случае это CSV 1 из столбцов которого содержит в себе текстовую строку, а кто сказал что текстовая строка не может содержать внутри себя HTML разметку!

SLAVICK, Долго писал подобную функцию пытаясь описать все возможные случаи но в итоге решил все проще с помощью двух строчек кода.
[vba]
Код
Set POpen = CreateObject("WScript.Shell")
POpen.Run "Путь_к_файлу"
[/vba]
Этот код повторяет действия пользователя равнозначные двойному щелчку мышкой по файлу. А как было сказано ранее в таком случае эксель корректно открывает файл.

Автор - Poltava
Дата добавления - 04.04.2018 в 22:41
KuklP Дата: Среда, 04.04.2018, 22:43 | Сообщение № 11
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
У меня одна строка :) И без сторонних библиотек.


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеУ меня одна строка :) И без сторонних библиотек.

Автор - KuklP
Дата добавления - 04.04.2018 в 22:43
Pelena Дата: Среда, 04.04.2018, 22:44 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 19162
Репутация: 4412 ±
Замечаний: ±

Excel 365 & Mac Excel
Poltava, код надо не под спойлер класть, а оформлять тегами с помощью кнопки #


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеPoltava, код надо не под спойлер класть, а оформлять тегами с помощью кнопки #

Автор - Pelena
Дата добавления - 04.04.2018 в 22:44
Poltava Дата: Среда, 04.04.2018, 22:52 | Сообщение № 13
Группа: Друзья
Ранг: Форумчанин
Сообщений: 232
Репутация: 50 ±
Замечаний: 0% ±

Poltava, код надо не под спойлер класть, а оформлять тегами с помощью кнопки #

Исправил
У меня одна строка И без сторонних библиотек.

Да у вас вариант лучше но Ваш ответ появился пока я писал свой и я его просто не видел пока не опубликовал свой ответ :)
Всем спасибо за помощь
 
Ответить
Сообщение
Poltava, код надо не под спойлер класть, а оформлять тегами с помощью кнопки #

Исправил
У меня одна строка И без сторонних библиотек.

Да у вас вариант лучше но Ваш ответ появился пока я писал свой и я его просто не видел пока не опубликовал свой ответ :)
Всем спасибо за помощь

Автор - Poltava
Дата добавления - 04.04.2018 в 22:52
SLAVICK Дата: Четверг, 05.04.2018, 09:11 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2290
Репутация: 766 ±
Замечаний: 0% ±

2019
Ну тогда немного огорчу вас, други

да уж. А я ведь крутил это только по другому - пробовал delimiter:=";"
[vba]
Код
Workbooks.Open Filename:="c:\Users\y.popov\Downloads\post68449648.csv", delimiter:=";"
[/vba]
но при таком коде - портят все ячейки с HTML, да и код этот открывает отдельно книгу - а потом из нее нужно это все скопировать...

У меня одна строка
с помощью PowerQuery - тоже получился запрос в одну строку (пост 6) - но зато обновляемое подключение в текущей книге.:
[vba]
Код
let source = Table.PromoteHeaders(Csv.Document(File.Contents("C:\Users\y.popov\Downloads\post68449648.csv"),null,";",null,1200)) in source
[/vba]
для обычного импорта из текста не получилось настроить параметры.

И без сторонних библиотек
зато с привязкой к локали - а это иногда хуже :D .
с помощью двух строчек кода.
тоже возможно кривое открытие в англоязычном экселе.
Так что мой длиннющий код - тоже имеет право на жизнь :) .


Иногда все проще чем кажется с первого взгляда.
 
Ответить
Сообщение
Ну тогда немного огорчу вас, други

да уж. А я ведь крутил это только по другому - пробовал delimiter:=";"
[vba]
Код
Workbooks.Open Filename:="c:\Users\y.popov\Downloads\post68449648.csv", delimiter:=";"
[/vba]
но при таком коде - портят все ячейки с HTML, да и код этот открывает отдельно книгу - а потом из нее нужно это все скопировать...

У меня одна строка
с помощью PowerQuery - тоже получился запрос в одну строку (пост 6) - но зато обновляемое подключение в текущей книге.:
[vba]
Код
let source = Table.PromoteHeaders(Csv.Document(File.Contents("C:\Users\y.popov\Downloads\post68449648.csv"),null,";",null,1200)) in source
[/vba]
для обычного импорта из текста не получилось настроить параметры.

И без сторонних библиотек
зато с привязкой к локали - а это иногда хуже :D .
с помощью двух строчек кода.
тоже возможно кривое открытие в англоязычном экселе.
Так что мой длиннющий код - тоже имеет право на жизнь :) .

Автор - SLAVICK
Дата добавления - 05.04.2018 в 09:11
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Правильное открытие CSV файла (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!