Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Текст по столбцам. Excel. VBS (http://forum.oszone.net/showthread.php?t=245792)

LilLoco 30-10-2012 12:16 2014966

Текст по столбцам. Excel. VBS
 
Добрый день, Уважаемые.

Столкнулся с проблемой. Vbs пока что только осваиваю, поэтому прошу сильно не пинать.
В общем имеется текстовый файл с такой структурой:
PHP код:

25/10/2012;08:57:49;37.4639600;55.8085733;15 
25
/10/2012;08:57:50;37.4639600;55.8085733;15 
25
/10/2012;08:57:51;37.4639600;55.8085733;18
................................................................................ 

где первая и вторая колонка - дата и время соответственно.
Файл довольно большой, порядка 100000 строк и более.
Средствами VBS этот файл открывается в Excel (2010), и при помощи
Код:

Dim app
Set app = CreateObject("Excel.Application")
...........
app.Selection.TextToColumns app.ActiveSheet.Range("A1"), 1, 1, 0, 0, 0, 0, 0, 1, ";"'нашел где то в просторах интернета

разбивается на столбцы.
При этом первый столбец не меняет формат на "Дата". Да и при любом формате, уже вручную, остается без изменений.
Если же все сделать ручками в экселе, то при разбивке строк на колонке все хорошо работает.
Думаю причиной всему являются параметры процедуры TextToColumns, но пока не могу определить конкретику.
Поэтому прошу Вас помочь мне.
Заранее благодарен.

ай, ай, ай. Не в той ветке создал( перенесите пожалуйста!

Iska 30-10-2012 22:28 2015395

Цитата:

Цитата LilLoco
Средствами VBS этот файл открывается в Excel (2010), »

1. Как именно открывается? Приведите весь значимый код.
2. Вам нужно открыть именно из WSH в Excel? Какова конечная цель? Что планируется делать с этими данными далее?

LilLoco 31-10-2012 08:32 2015611

Цитата:

Цитата Iska
Приведите весь значимый код »

Код:

Const FileNameLog = "D:\1\log.txt"
Const FileNameSave = "D:\1\log.xlsx"

Dim app, book

Set app = WScript.CreateObject("Excel.Application")
app.Visible = true
Set book = app.Workbooks.Open(FileNameLog)

app.ActiveSheet.Columns("A:A").Select
app.Selection.TextToColumns app.ActiveSheet.Range("A1"), 1, 1, 0, 0, 0, 0, 0, 1, ";"



app.ActiveSheet.Columns("B:B").Select
app.Selection.NumberFormat = "[$-F400]h:mm:ss AM/PM"

app.ActiveSheet.UsedRange.Select

book.SaveAs FileNameSave,51

Set book = Nothing
app.DisplayAlerts = false
app.Quit
app.DisplayAlerts = true
Set app = Nothing

Вот в принципе весь код для этого текстового файла.

Цитата:

Цитата Iska
Какова конечная цель? »

Конечная цель заключается в том, что из 2х текстовых файлов создается 2 документа excel, из которых, в последующем, по средствам запросов "сопоставляются" данные из первого файла и из второго(по полям дат).

Попробовал сделать все вручную, записав при этом макрос. При действиях руками,- все работает. Но с этими же данными, но при помощи записанного макроса, так же не работает.

Iska 31-10-2012 10:34 2015650

Коллега, не представляю, как Вы пробовали записывать макрос, если от него ничего в коде не осталось.

Пробуйте:
читать дальше »
Код:

Option Explicit

Const xlDelimited = 1
Const xlDoubleQuote = 1
Const xlNormal = &HFFFFEFD1


Dim strFileNameLog
Dim strFileNameSave

Dim objWorkbook


strFileNameLog  = "D:\1\log.txt"
strFileNameSave = "D:\1\log.xlsx"

With WScript.CreateObject("Excel.Application")
        .Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
                False, False, True, False, False, False, False, _
                Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1))
               
        For Each objWorkbook In .Workbooks
                If objWorkbook.FullName = strFileNameLog Then
                        With objWorkbook
                                .SaveAs strFileNameSave, xlNormal
                                .Close
                        End With
                       
                        Exit For
                End If
        Next
       
        .Quit
End With

WScript.Quit 0



Цитата:

Цитата LilLoco
Конечная цель заключается в том, что из 2х текстовых файлов создается 2 документа excel, из которых, в последующем, по средствам запросов "сопоставляются" данные из первого файла и из второго(по полям дат). »

Может, есть смысл делать это сразу? Или там больше «ручное» сравнение?

LilLoco 31-10-2012 10:43 2015656

Цитата:

Цитата Iska
Может, есть смысл делать это сразу? »

Может и есть, но в голову ничего больше не пришло к сожалению.

Цитата:

Цитата Iska
Коллега, не представляю, как Вы пробовали записывать макрос, если от него ничего в коде не осталось. »

Начал запись, сделал "текст по столбцам", закончил запись. Там был код. Я что - то не так сделал?(

Iska 31-10-2012 10:59 2015667

Цитата:

Цитата LilLoco
Начал запись, сделал "текст по столбцам", закончил запись. Там был код. Я что - то не так сделал?( »

Угу. Запустил Microsoft Excel. Создал пустую книгу (если не было). Начал запись макроса. \Файл\Открыть (я, понятно, для пред-2007-х версий описываю), выбрал текстовый файл, ответил на вопросы по импорту. После открытия файла закончил запись макроса. Нажал Alt-F11, открыл в первой, пустой книге полученный модуль с записанным кодом. Перевёл с VBA на WSH.

Цитата:

Цитата LilLoco
Может и есть, но в голову ничего больше не пришло к сожалению. »

А то, смотрите — если запросы, то можно и непосредственно из текстовых файлов попробовать извлекать и связывать данные, представляя их как таблицы базы данных: «select … from … inner join … where … order …» и т.п.

LilLoco 31-10-2012 11:10 2015672

Iska, Огромное спасибо все работает.

Еще такой вот вопрос.
Для даты используется формат даты (xlDMYFormat = 4), а если колонка содержит дату и время (дд/ММ/гггг чч:мм:сс), какой формат при этом необходимо использовать?

Цитата:

Цитата Iska
непосредственно из текстовых файлов попробовать извлекать и связывать данные, представляя их как таблицы базы данных »

Буду искать, изучать. Так было бы конечно же лучше. Спасибо за наводку)

Iska 31-10-2012 11:24 2015677

Цитата:

Цитата LilLoco
Для даты используется формат даты (xlDMYFormat = 4), »

Где? В моём коде нет такого.

Цитата:

Цитата LilLoco
а если колонка содержит дату и время (дд/ММ/гггг чч:мм:сс), какой формат при этом необходимо использовать? »

Так у Вас же не содержит. У Вас два поля, разделённых «;», отдельно дата и отдельно время.

LilLoco 31-10-2012 11:39 2015686

Цитата:

Цитата Iska
Где? В моём коде нет такого. »

Цитата:

Цитата Iska
Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) »

Разве это не оно?

Цитата:

Цитата Iska
Так у Вас же не содержит »

Это в этом файле. Есть другие, где содержатся такие даты :(

Iska 31-10-2012 21:01 2016039

Цитата:

Цитата LilLoco
Разве это не оно? »

Оно. Я просто глазами всё искал именно упомянутую мнемоническую константу.

Цитата:

Цитата LilLoco
Это в этом файле. Есть другие, где содержатся такие даты »

LilLoco, надо пробовать — в принципе, сам формат дата/время поддерживается. Можете выложить часть файла, как делали это выше.

LilLoco 01-11-2012 08:05 2016292

Цитата:

Цитата Iska
Я просто глазами всё искал именно упомянутую мнемоническую константу. »

Простите, ввел Вас в заблуждение =(

Цитата:

Цитата Iska
Можете выложить часть файла »

Да, конечно.
PHP код:

04/10/2012 15:24:23;[GSM Init SMGSMRead signal 31 strenght.
04/10/2012 15:24:25;[GSM Init SMGSMRead signal 31 strenght.
04/10/2012 15:24:27;[GSM Init SMGSMRead signal 31 strenght.
................................. 

Вот так вот выглядит файл.

Цитата:

Цитата Iska
в принципе, сам формат дата/время поддерживается »

Угу, если делать, опять же, вручную - все работает.

Iska 01-11-2012 09:20 2016315

Цитата:

Цитата LilLoco
если делать, опять же, вручную - все работает. »

читать дальше »
Код:

Option Explicit

Const xlDelimited = 1
Const xlDoubleQuote = 1
Const xlNormal = &HFFFFEFD1


Dim strFileNameLog
Dim strFileNameSave

Dim objWorkbook


strFileNameLog  = "E:\Песочница\0196\0002.txt"
strFileNameSave = "E:\Песочница\0196\0002.xls"

With WScript.CreateObject("Excel.Application")
        .Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
                False, False, True, False, False, False, False, _
                Array(Array(1, 4), Array(2, 1))
               
        For Each objWorkbook In .Workbooks
                If objWorkbook.FullName = strFileNameLog Then
                        With objWorkbook
                                .SaveAs strFileNameSave, xlNormal
                                .Close
                        End With
                       
                        Exit For
                End If
        Next
       
        .Quit
End With

WScript.Quit 0


— более ничего не менял. Есть один момент: в первом файле даты были в непонятном формате: символ «/» обычно используется в формате даты «MM/DD/YY», а там явно было «DD/MM/YY». Тем не менее, Excel верно их распознал без дополнительных указаний. А в каком формате даты в новом файле?

LilLoco 01-11-2012 09:59 2016329

Цитата:

Цитата Iska
А в каком формате даты в новом файле? »

Формат даты тот же, что и у первого файла «DD/MM/YY».

Цитата:

Цитата Iska
более ничего не менял »

Да, с приведенными данными работает. Но как только даты достигают значений, например, 25/03/2010 даты перестают обрабатываться, к сожалению :(

Возможен ли выход из этой ситуации, или же будет необходимо сначала привести дату к виду «MM/DD/YY»?

Iska 01-11-2012 15:39 2016543

Цитата:

Цитата LilLoco
Возможен ли выход из этой ситуации, или же будет необходимо сначала привести дату к виду «MM/DD/YY»? »

LilLoco, я разобрался:
Код:

        .Workbooks.OpenText strFileNameLog, 1251, 1, xlDelimited, xlDoubleQuote, _
                False, False, True, False, False, False, False, _
                Array(Array(1, 4), Array(2, 1)), , , , , True


LilLoco 01-11-2012 15:59 2016557

Цитата:

Цитата Iska
я разобрался »

А вот мне бы ума не хватило :(

Iska, Спасибо Вам огромное)

Цитата:

Цитата LilLoco
Буду искать, изучать. Так было бы конечно же лучше. »

За это время изучил и приспособил и этот вариант.

Спасибо ;)

sov44 03-04-2014 10:39 2332468

Нужна помощь!
Имеется файл 1.xls типа
Код:

11.6308010-10        Амортизатор газовый задней двери "Соболь-Баргузин" Гродно ГАЗ        579
необходимо значение каждой строки первого столба взять в переменную, если переменная найдена в файле 2.xls типа
Код:

Код  13400030  Арт.  3163-10-1101009-00        УАЗ  бак топливн.левый Патриот        5807,50 руб.
сформировать из 2.xls файл 3.xls
файлы http://rghost.ru/53730995

Iska 03-04-2014 13:13 2332521

sov44, ткните пальцем, где она найдена?

sov44 03-04-2014 13:31 2332533

Iska, в посте выше я показал только структуру файлов. Сами файлы в архиве по ссылке снизу. Пока удалось найти повторы
Код:

451-50-1701022
406.1006260-02
469-1701048
451-50-1701050-10
469-1108030

Перевёл excel в txt и парсю батником второй час. Но батник не вариант, нужен вывод в excel

Iska 03-04-2014 14:54 2332573

sov44, непосредственно в Excel или из-под WSH будет ненамного быстрее. Вы ведь ищете 1) по подстроке; 2) всё во всех, т.е. 10894*2496=27191424 сравнений.

sov44 03-04-2014 16:29 2332613

Iska, решил задачу батником и ручками. :nunchaku:

Iska 03-04-2014 17:35 2332641

sov44, на мой взгляд, самым быстрым вариантом будет экспорт в текстовые файлы, и работа с ними посредством OLEDB с одним оператором вида «select from 1 inner join 2 into 3». В отличие от любых переборов, должно отрабатывать за секунды.

Цитата:

Цитата sov44
Iska, решил задачу батником и ручками. »

Так это единичная задача была? Не регулярная?

sov44 03-04-2014 20:10 2332722

Цитата:

Цитата Iska
Так это единичная задача была? Не регулярная? »

осталось ещё две пары....

Iska 03-04-2014 20:39 2332743

Ну, тогда нет особого смысла затевать телодвижения в эту сторону.


Время: 07:39.

Время: 07:39.
© OSzone.net 2001-