Автор Тема: [Автоматизация] Корректировка файлов *.txt и с последующим сохранением в *.xls  (Прочитано 1979 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
Версия AutoIt: 3.3.14.2 -- 18.09.2015

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

Алгоритм работы программы после запуска скрипта:
            - найти все файлы *.txt в папке, из которой запущен скрипт (где лежит);
            - преобразовать найденные файлы в экселевские файлы *.xls ( Ox.txt -> Ox.xls);
            - сохранить новые экселевские файлы в папке, из которой запущен скрипт (где лежит);

Примечания:
Текстовые файлы представляют собой построчный набор чисел с разделителем "." произвольной длинны (от 1 до 10^6), пример для 13. Один из файлов прикладываю. Например с таким содержанием:

Цитировать
0.606217782649107
0.762484238517637
0.973021464970246
1.21243556529821
1.45184966562618

Готовые *.xls файлы представляют собой таблицу, в которой заполнен первый столбик числами из файлов *.txt.
Для выше приведенного примера, получится один столбик

Цитировать
0,606217783
0,762484239
0,973021465
1,212435565
1,451849666

Обратите внимание, что вместо "." в *.txt файлах, используется "," в *.xls файлах. Это позволяет воспринимать данные из *.xls в последующих программах, как числа, а не как текст.

Я обычно открывал каждый txt вручную, далее через поиск и замену, менял "." на ",", потом открывал в  excel каждый *.txt и сохранял как *.xls (попутно указывая разделитель ","). Когда файлы пошли на десятки я стал задумываться, - а все ли правильно я делаю.

Надеюсь на вашу помощь! Спасибо, всем откликнувшимся.

Подготовил файлы для прикрепления, но не могу найти, как, тт



Русское сообщество AutoIt


Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1235
  • Репутация: 174
  • Пол: Мужской
  • Windows7 (x64)
    • Награды
  • Версия AutoIt: 3.3.12.0
Код: AutoIt [Выделить]
#include <File.au3>
#include <Excel.au3>

Global $aFileList, $oExcel, $sText, $aText, $oWorkbook

$aFileList = _FileListToArray(@ScriptDir, '*.txt', $FLTA_FILES)
If @error Then Exit

$oExcel = _Excel_Open(False)
For $i = 1 To $aFileList[0]
    $sText = FileRead(@ScriptDir & '\' & $aFileList[$i])
    If @error Then ContinueLoop
    $aText = StringRegExp($sText, '(?m)(\d+\.\d+)\s*$', 3)
    If @error Then ContinueLoop
    For $j = 0 To UBound($aText) - 1
        $aText[$j] = StringReplace(Round($aText[$j], 9), '.', ',') ; Round() => округление до 9 символов после запятой
    Next
    $oWorkbook = _Excel_BookNew($oExcel)
    If @error Then ContinueLoop
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aText)
    If Not @error Then _Excel_BookSaveAs($oWorkbook, @ScriptDir & '\' & StringTrimRight($aFileList[$i], 3) & 'xls', $xlExcel8)
    _Excel_BookClose($oWorkbook, False)
Next
_Excel_Close($oExcel)


Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
Спасибо, что откликнулись! С вашим текстом создал скрипт, поместил в папку, запустил *.a3x, ничего не произошло. Сделал *.exe, запустил его, ничего не произошло. Добавил в папку файлы File.au3, Excel.au3, после чего опять заново сделал и *.a3x, и *.exe - ничего не произошло.

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

Код: AutoIt [Выделить]
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Outfile_type=a3x
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#include <File.au3>
#include <Excel.au3>

Global $aFileList, $oExcel, $sText, $aText, $oWorkbook
MsgBox(0, "Обучение", "Привет Мир! Начало")
$aFileList = _FileListToArray(@ScriptDir, '*.txt', $FLTA_FILES)
If @error Then Exit
MsgBox(0, "Обучение", "Привет Мир! Цикл пошел")
$oExcel = _Excel_Open(False)
For $i = 1 To $aFileList[0]
    $sText = FileRead(@ScriptDir & '\' & $aFileList[$i])
    If @error Then ContinueLoop
    $aText = StringRegExp($sText, '(?m)(\d+\.\d+)\s*$', 3)
    If @error Then ContinueLoop
    For $j = 0 To UBound($aText) - 1
        $aText[$j] = StringReplace(Round($aText[$j], 9), '.', ',') ; Round() => округление до 9 символов после запятой
    Next
    $oWorkbook = _Excel_BookNew($oExcel)
    If @error Then ContinueLoop
    _Excel_RangeWrite($oWorkbook, $oWorkbook.Activesheet, $aText)
    If Not @error Then _Excel_BookSaveAs($oWorkbook, @ScriptDir & '\' & StringTrimRight($aFileList[$i], 3) & 'xls', $xlExcel8)
    _Excel_BookClose($oWorkbook, False)
Next
_Excel_Close($oExcel)
MsgBox(0, "Обучение", "Привет Мир!")
 


Сделал скриншот папки, но с моими правами запрещено давать ссылки. Разве, что вот так:
(нажмите для показа/скрытия)

« Последнее редактирование: Март 10, 2017, 09:18:51 от NiceScript, Причина: более разборчивый скриншот »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Код: AutoIt [Выделить]
#include <Excel.au3>
Local $hSearch = FileFindFirstFile('*.txt')
If @error Then Exit MsgBox(16, 'Ошибка', 'Нет файлов txt')
Local $sFile, $sData, $aData, $oBook, $oExcel = _Excel_Open(False)
While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop

    $sData = FileRead($sFile) ;Читаем файл
    $sData = StringReplace($sData, '.', ',') ;Меняем точки на запятые
    $aData = StringSplit($sData, @CRLF, 1 + 2) ;Делаем массив

    $oBook = _Excel_BookNew($oExcel) ;Новая книга
    _Excel_RangeWrite($oBook, 1, $aData) ;запись массива
    _Excel_BookSaveAs($oBook, @ScriptDir & '\' & $sFile & '.xls', $xlExcel8) ;сохранение как xls
    _Excel_BookClose($oBook, False) ;Закрытие
WEnd
_Excel_Close($oExcel)


Русское сообщество AutoIt


Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
#include <Excel.au3>
Local $hSearch = FileFindFirstFile('*.txt')
If @error Then Exit MsgBox(16, 'Ошибка', 'Нет файлов txt')
Local $sFile, $sData, $aData, $oBook, $oExcel = _Excel_Open(False)
While 1
    $sFile = FileFindNextFile($hSearch)
    If @error Then ExitLoop

    $sData = FileRead($sFile) ;Читаем файл
    $sData = StringReplace($sData, '.', ',') ;Меняем точки на запятые
    $aData = StringSplit($sData, @CRLF, 1 + 2) ;Делаем массив

    $oBook = _Excel_BookNew($oExcel) ;Новая книга
    _Excel_RangeWrite($oBook, 1, $aData) ;запись массива
    _Excel_BookSaveAs($oBook, @ScriptDir & '\' & $sFile & '.xls', $xlExcel8) ;сохранение как xls
    _Excel_BookClose($oBook, False) ;Закрытие
WEnd
_Excel_Close($oExcel)


Скрипт вечно сидит в цикле While и не может оттуда выйти без посторонней помощи. Причем он там сидит  в независимости от того, если ли с ним в папке *.txt файлы или нет. Файлы *.xls не создаются.

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1235
  • Репутация: 174
  • Пол: Мужской
  • Windows7 (x64)
    • Награды
  • Версия AutoIt: 3.3.12.0
NiceScript, у вас Office-то какой?


Добавлено: Март 10, 2017, 15:34:37
Скопируйте всю папку на рабочий стол и там попробуйте.
« Последнее редактирование: Март 10, 2017, 15:34:37 от Alofa, Причина: Объединение сообщений »

Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
NiceScript, у вас Office-то какой?


Добавлено: Март 10, 2017, 15:34:37
Скопируйте всю папку на рабочий стол и там попробуйте.

Microsoft Office Excel 2003 (11.8342.8341) SP3

И папку на рабочий стол помещал, и файлы просто на рабочий стол размещал - запускал скрипт с вашим текстом, ничего не происходит.

Я тут хелп стал читать, а там пример
Код: AutoIt [Выделить]
; ************************************************
; Пример 1 - Создает рабочую книгу Excel
; ************************************************
#include <Excel.au3>

$oExcel = _ExcelBookNew()
    If Not @error Then MsgBox(4096, "_ExcelBookNew | Пример 1", "Книга создана!")
 


Когда его выполняю, то пишется ошибка (в ваших скриптах никаких ошибок не выдает интерпретатор):
error: _ExcelBookNew(): undefined function.

может это быть связано?

Оффлайн Garrett [?]

  • Глобальный модератор
  • *
  • Сообщений: 3999
  • Репутация: 960
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
NiceScript
Ответ #4
ПредупреждениеЗа нарушение общих правил (пункт В.2):
Цитировать
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.

Скорблю и помню.




Русское сообщество AutoIt


Оффлайн ra4o [?]

  • Скриптер
  • ****
  • Сообщений: 693
  • Репутация: 119
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Цитировать
может это быть связано?
С тем, что пример в русской справке под старую версию AutoIt , начиная по-моему с 12 версии (может и раньше) изменилась UDF "Excel.au3" и стала не совместима с прежними версиями. Функция из Вашего примера в новой версии - "_Excel_BookNew()", смотрите примеры в англоязычной справке.
(нажмите для показа/скрытия)
Если преобразовать Ваши файлы в формат csv , Вас устроит? Так можно обойтись вообще без  UDF "Excel.au3"

Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
...
Если преобразовать Ваши файлы в формат csv , Вас устроит? Так можно обойтись вообще без  UDF "Excel.au3"

Импорт *.csv  файла в последующей программе  рассматривает запятую, как разделитель и разносит целую и дробную часть в разные элементы списка.
Если же оставить точку, то считает это строкой. В общем - не устроит, но спасибо, что посмотрел!

Так же ваш пример из английского хелпа позволил создать файл в *.xls, значит в этом плане все нормально.

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1235
  • Репутация: 174
  • Пол: Мужской
  • Windows7 (x64)
    • Награды
  • Версия AutoIt: 3.3.12.0
... Microsoft Office Excel 2003 ...
Никогда не понимал этой привязанности к 2003-му, но это ладно.
У вас два варианта разрешения ситуации:
(нажмите для показа/скрытия)
(нажмите для показа/скрытия)

Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
...
Никогда не понимал этой привязанности к 2003-му, но это ладно.
...

Воспринимайте это как рабочий инструмент, который удобнее последующих для конкретной работы.
Ваш второй вариант работает, за исключением следующих недоразумений.

Данные из *.txt
1.50051547761422
6.57252030578093E-14
-1.50051547761424

Превратятся в *.xls
1,500515478
6,572520306
1,500515478

А должны в *.xls
1,50051547761422
6,57252030578093E-14
-1,50051547761424

Если бы дело было в значащих цифрах, то я спокойно сделал бы Round(<>, 14), но тут дело с околонулевыми значениями. Есть вариант это исправить? В общем случае вы задачу решили, правда, она пока не пригодна для работы.

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1235
  • Репутация: 174
  • Пол: Мужской
  • Windows7 (x64)
    • Награды
  • Версия AutoIt: 3.3.12.0
... за исключением следующих недоразумений.
Мы так не договаривались :o

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 460
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
NiceScript  [?]
Цитировать
Скрипт вечно сидит в цикле While и не может оттуда выйти без посторонней помощи. Причем он там сидит  в независимости от того, если ли с ним в папке *.txt файлы или нет.
Парни, подскажите, как такое может быть?

Оффлайн NiceScript [?]

  • Новичок
  • *
  • Сообщений: 8

  • Автор темы
  • Репутация: 0
  • Пол: Женский
    • Награды
  • Версия AutoIt: 3.3.14.0
... за исключением следующих недоразумений.
Мы так не договаривались :o

Ладно, ставлю задача решена. Спасибо огромное.
Переделаю формат вывода в *.txt файлы ({0:f14}), тогда и мантисс  не будет.

Кстати, а если файлы *.txt будут следующего типа
0,606217782649107; 0,35;
0,606217782649107; 0,35;
0,862435565298214; 0,606217782649107;

тяжело ли их переделывать в *.xls, но уже не по одному столбику в файле, а столько, сколько содержится ';' в *.txt

NiceScript  [?]
Цитировать
Скрипт вечно сидит в цикле While и не может оттуда выйти без посторонней помощи. Причем он там сидит  в независимости от того, если ли с ним в папке *.txt файлы или нет.
Парни, подскажите, как такое может быть?

Мой конечный автомат твой тьюринг бумага заляпал в месте @error.

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2023 Просмотров
Последний ответ Август 04, 2010, 16:44:18
от Pavel
8 Ответов
9224 Просмотров
Последний ответ Январь 07, 2011, 19:22:48
от RUVATA
2 Ответов
1868 Просмотров
Последний ответ Май 28, 2011, 00:38:32
от CreatoR
20 Ответов
5551 Просмотров
Последний ответ Июнь 15, 2013, 10:51:05
от prokazzza
8 Ответов
3575 Просмотров
Последний ответ Март 05, 2014, 17:47:10
от ---Zak---
5 Ответов
2966 Просмотров
Последний ответ Февраль 22, 2015, 20:50:14
от Leonid Feclichev
0 Ответов
504 Просмотров
Последний ответ Февраль 22, 2015, 13:58:26
от madmasles
9 Ответов
2193 Просмотров
Последний ответ Март 09, 2015, 12:32:11
от madmasles
3 Ответов
960 Просмотров
Последний ответ Март 17, 2015, 16:49:47
от forc1k
3 Ответов
1662 Просмотров
Последний ответ Июль 12, 2015, 17:32:25
от Core2Duo76