PDA

Показать полную графическую версию : [решено] Текст по столбцам. Excel. VBS


Страниц : [1] 2

LilLoco
30-10-2012, 12:16
Добрый день, Уважаемые.

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

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
Средствами VBS этот файл открывается в Excel (2010), »
1. Как именно открывается? Приведите весь значимый код.
2. Вам нужно открыть именно из WSH в Excel? Какова конечная цель? Что планируется делать с этими данными далее?

LilLoco
31-10-2012, 08:32
Приведите весь значимый код »

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

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

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

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

Iska
31-10-2012, 10:34
Коллега, не представляю, как Вы пробовали записывать макрос, если от него ничего в коде не осталось.

Пробуйте:
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


Конечная цель заключается в том, что из 2х текстовых файлов создается 2 документа excel, из которых, в последующем, по средствам запросов "сопоставляются" данные из первого файла и из второго(по полям дат). »
Может, есть смысл делать это сразу? Или там больше «ручное» сравнение?

LilLoco
31-10-2012, 10:43
Может, есть смысл делать это сразу? »
Может и есть, но в голову ничего больше не пришло к сожалению.

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

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

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

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

LilLoco
31-10-2012, 11:10
Iska, Огромное спасибо все работает.

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

непосредственно из текстовых файлов попробовать извлекать и связывать данные, представляя их как таблицы базы данных »
Буду искать, изучать. Так было бы конечно же лучше. Спасибо за наводку)

Iska
31-10-2012, 11:24
Для даты используется формат даты (xlDMYFormat = 4), »
Где? В моём коде нет такого.

а если колонка содержит дату и время (дд/ММ/гггг чч:мм:сс), какой формат при этом необходимо использовать? »
Так у Вас же не содержит. У Вас два поля, разделённых «;», отдельно дата и отдельно время.

LilLoco
31-10-2012, 11:39
Где? В моём коде нет такого. »
Array(Array(1, 4), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) »
Разве это не оно?

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

Iska
31-10-2012, 21:01
Разве это не оно? »
Оно. Я просто глазами всё искал именно упомянутую мнемоническую константу.

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

LilLoco
01-11-2012, 08:05
Я просто глазами всё искал именно упомянутую мнемоническую константу. »
Простите, ввел Вас в заблуждение =(

Можете выложить часть файла »
Да, конечно.

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

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

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

Iska
01-11-2012, 09:20
если делать, опять же, вручную - все работает. »
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
А в каком формате даты в новом файле? »
Формат даты тот же, что и у первого файла «DD/MM/YY».

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

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

Iska
01-11-2012, 15:39
Возможен ли выход из этой ситуации, или же будет необходимо сначала привести дату к виду «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
я разобрался »
А вот мне бы ума не хватило :(

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

Буду искать, изучать. Так было бы конечно же лучше. »
За это время изучил и приспособил и этот вариант.

Спасибо ;)

sov44
03-04-2014, 10:39
Нужна помощь!
Имеется файл 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
sov44, ткните пальцем, где она найдена?

sov44
03-04-2014, 13:31
Iska, в посте выше я показал только структуру файлов. Сами файлы в архиве по ссылке снизу. Пока удалось найти повторы 451-50-1701022
406.1006260-02
469-1701048
451-50-1701050-10
469-1108030
Перевёл excel в txt и парсю батником второй час. Но батник не вариант, нужен вывод в excel

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

sov44
03-04-2014, 16:29
Iska, решил задачу батником и ручками. :nunchaku:




© OSzone.net 2001-2012