Доброго времени суток всем. Не могу победить 1 проблему. При открытии CSV файла двойным кликом все хорошо но при попытке открытия уже из самого экселя он предлагает сделать настройки импорта CSV после чего структура файла разваливается. Я так и не смог подобрать подходящих настоек хотя при двойном нажатии по файлу в проводнике эксель сам распознает все необходимые настройки к тому же правильно!
Вот пример правильного.
и непровильного
Доброго времени суток всем. Не могу победить 1 проблему. При открытии CSV файла двойным кликом все хорошо но при попытке открытия уже из самого экселя он предлагает сделать настройки импорта CSV после чего структура файла разваливается. Я так и не смог подобрать подходящих настоек хотя при двойном нажатии по файлу в проводнике эксель сам распознает все необходимые настройки к тому же правильно!
Poltava, Не знаю тоже с чем связана такая разница, но если из экселя зажимая шифт будем открывать, так же откроется как Вам надо... Судя по тому, как выглядит импортнутый файл из csv, мне кажется, что обычная вставка с разделителями не позволит алгоритму вставить нужные поля в нужные ячейки...
Poltava, Не знаю тоже с чем связана такая разница, но если из экселя зажимая шифт будем открывать, так же откроется как Вам надо... Судя по тому, как выглядит импортнутый файл из csv, мне кажется, что обычная вставка с разделителями не позволит алгоритму вставить нужные поля в нужные ячейки...Roman777
Много чего не знаю!!!!
Сообщение отредактировал Roman777 - Вторник, 03.04.2018, 09:37
По сути это не CSV файл. Это какой-то HTML. Поэтому Экс расшифровывает его как ему вздумается.
Цитата
CSV — Википедия https://ru.wikipedia.org/wiki/CSV CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация: Каждая строка файла — это одна строка таблицы. Разделителем (англ. delimiter) значений колонок является символ запятой ( , ).
По сути это не CSV файл. Это какой-то HTML. Поэтому Экс расшифровывает его как ему вздумается.
Цитата
CSV — Википедия https://ru.wikipedia.org/wiki/CSV CSV (от англ. Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация: Каждая строка файла — это одна строка таблицы. Разделителем (англ. delimiter) значений колонок является символ запятой ( , ).
Да - это тегированная таблица, хотя и в CSV. Тут вот описана похожая ситуация. Когда- то тоже с таким сталкивался. Excel - понимает, что это таблица - и автоматически ее преобразовывает. Тот же результат будет если открыть блокнот, скопировать весь текст и вставить в Excel.
[vba]
Код
Sub Sample() Dim Ie As Object Set Ie = CreateObject("InternetExplorer.Application") With Ie .Visible = False .Navigate "about:blank" [a1] = "1<font color=blue>a</font>23<font color=red>4</font>" .document.body.InnerHTML = "1<font color=blue>a</font>23<font color=red>4</font>" 'update to the cell that contains HTML you want converted .ExecWB 17, 0 'Select all contents in browser .ExecWB 12, 2 'Copy them ActiveSheet.Paste Destination:=Sheets(1).Range("A2") 'update to cell you want converted HTML pasted in .Quit End With End Sub
[/vba]
Если использовать импорт при помощи Csv.Document в PowerQuery - то можно добиться нужного результата:
Да - это тегированная таблица, хотя и в CSV. Тут вот описана похожая ситуация. Когда- то тоже с таким сталкивался. Excel - понимает, что это таблица - и автоматически ее преобразовывает. Тот же результат будет если открыть блокнот, скопировать весь текст и вставить в Excel.
[vba]
Код
Sub Sample() Dim Ie As Object Set Ie = CreateObject("InternetExplorer.Application") With Ie .Visible = False .Navigate "about:blank" [a1] = "1<font color=blue>a</font>23<font color=red>4</font>" .document.body.InnerHTML = "1<font color=blue>a</font>23<font color=red>4</font>" 'update to the cell that contains HTML you want converted .ExecWB 17, 0 'Select all contents in browser .ExecWB 12, 2 'Copy them ActiveSheet.Paste Destination:=Sheets(1).Range("A2") 'update to cell you want converted HTML pasted in .Quit End With End Sub
[/vba]
Если использовать импорт при помощи Csv.Document в PowerQuery - то можно добиться нужного результата:SLAVICK
Roman777, Спасибо действительно при зажатом шифте открывается так же как и при двойном клике но меня интересует именно программная обработка.
KuklP, Очень уважаю Ваше экспертное мнение, но все же файл полностью соответствует спецификации CSV файла. Это видно во первых из того что Ексель все же при двойном клике правильно открывает файл, во вторых то что вас смутило это действительно исходный код HTML который таким и должен остаться. но с точки зрения спецификации CSV это просто очередное значение разделенное разделителями и взятое в "" как содержащие зарезервированные символы. Так что чисто теоретически эксель должен бы его распознавать и очевидно что он это может в автоматическом режиме он с этим прекрасно справляется. Вопрос как это повторить программно.
SLAVICK, Спасибо интересный пример обязательно возьму на заметку но он не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML кодом что по сути обычный текст.
Сделал вывод что нужно писать свою функцию по импорту сложных CSV так как изучая уже более двух дней данную тему так и не смог найти решения казалось бы банальной задачи стандартными средствами. Попробую реализовать и тогда выложу тут что получиться.
Roman777, Спасибо действительно при зажатом шифте открывается так же как и при двойном клике но меня интересует именно программная обработка.
KuklP, Очень уважаю Ваше экспертное мнение, но все же файл полностью соответствует спецификации CSV файла. Это видно во первых из того что Ексель все же при двойном клике правильно открывает файл, во вторых то что вас смутило это действительно исходный код HTML который таким и должен остаться. но с точки зрения спецификации CSV это просто очередное значение разделенное разделителями и взятое в "" как содержащие зарезервированные символы. Так что чисто теоретически эксель должен бы его распознавать и очевидно что он это может в автоматическом режиме он с этим прекрасно справляется. Вопрос как это повторить программно.
SLAVICK, Спасибо интересный пример обязательно возьму на заметку но он не из той оперы он преобразует HTML код в его представление а мне нужно что бы это оставалось HTML кодом что по сути обычный текст.
Сделал вывод что нужно писать свою функцию по импорту сложных CSV так как изучая уже более двух дней данную тему так и не смог найти решения казалось бы банальной задачи стандартными средствами. Попробую реализовать и тогда выложу тут что получиться.Poltava
А какой у Вас офис? - мой пример файла смотрели - там импорт в 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"
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
А какой у Вас офис? - мой пример файла смотрели - там импорт в 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"
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
файл полностью соответствует спецификации CSV файла
Только мы с эксом и википедией считаем иначе.
Цитата
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML). HTML — Википедия
Цитату о "CSV — текстовый формат" я приводил выше. А теперь слово Эксу: И да, HTML можно читать блокнотом, но умней это делать приспособленными программами
файл полностью соответствует спецификации CSV файла
Только мы с эксом и википедией считаем иначе.
Цитата
HTML (от англ. HyperText Markup Language — «язык гипертекстовой разметки») — стандартизированный язык разметки документов во Всемирной паутине. Большинство веб-страниц содержат описание разметки на языке HTML (или XHTML). HTML — Википедия
Цитату о "CSV — текстовый формат" я приводил выше. А теперь слово Эксу: И да, HTML можно читать блокнотом, но умней это делать приспособленными программами KuklP
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.
KuklP, Вы все верно пишите но подойдите к вопросу творчески! HTML это по сути обычный текст написанный определенным стандартом как и CSV. Так вот в моем случае это CSV 1 из столбцов которого содержит в себе текстовую строку, а кто сказал что текстовая строка не может содержать внутри себя HTML разметку!
SLAVICK, Долго писал подобную функцию пытаясь описать все возможные случаи но в итоге решил все проще с помощью двух строчек кода. [vba]
Код
Set POpen = CreateObject("WScript.Shell") POpen.Run "Путь_к_файлу"
[/vba] Этот код повторяет действия пользователя равнозначные двойному щелчку мышкой по файлу. А как было сказано ранее в таком случае эксель корректно открывает файл.
KuklP, Вы все верно пишите но подойдите к вопросу творчески! HTML это по сути обычный текст написанный определенным стандартом как и CSV. Так вот в моем случае это CSV 1 из столбцов которого содержит в себе текстовую строку, а кто сказал что текстовая строка не может содержать внутри себя HTML разметку!
SLAVICK, Долго писал подобную функцию пытаясь описать все возможные случаи но в итоге решил все проще с помощью двух строчек кода. [vba]
Код
Set POpen = CreateObject("WScript.Shell") POpen.Run "Путь_к_файлу"
[/vba] Этот код повторяет действия пользователя равнозначные двойному щелчку мышкой по файлу. А как было сказано ранее в таком случае эксель корректно открывает файл.Poltava
Сообщение отредактировал Poltava - Среда, 04.04.2018, 22:47