Войти

Показать полную графическую версию : Разбивка строк общего файла на отдельные csv файлы


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

Iska
05-09-2018, 23:57
Я не знаю) »
У нас примерно три варианта для задания пути к исходному файлу, которое должно постоянно меняться:

1. Тупо указать в коде. Это был наш первый вариант (http://forum.oszone.net/post-2829774.html#post2829774) (и наихудший).

2. Указать аргументом скрипта. Это наш второй вариант (http://forum.oszone.net/post-2829908.html#post2829908) (и наиболее предпочтительный). Вы, например, можете просто перетаскивать исходный файл реестра на скрипт, я — могу быстро и удобно, посредством всего нескольких нажатий клавиш, указывать путь к исходному файлу реестра в командной строке Far Manager'а:https://i.imgur.com/ZZW5v4y.png
кто-то напишет пакетный файл, в котором будут перебираться только заданные файлы реестра:@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив1\1.xlsx" "C:\Мои проекты\0191\Архив1\2.xlsx" "C:\Мои проекты\0191\Архив2\bla-bla-bla.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

или все подряд файлы реестра в каталоге, наподобие:@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

И всё это будет работать.

3. Хранить путь в каком-либо заранее предопределённом и обговоренном месте. Например, использовать какой-нибудь файл конфигурации с предопределённым именем и местоположением, в котором указывать путь к исходному файлу (откуда он будет считываться скриптом). Или какой-нибудь предопределённый параметр в реестре. Столь же неудобно и малоосмысленно, как и прямое указание пути непосредственно в коде.

с VBA я ещё как то знаком, а вот с wsh совершенно нет. »
Они весьма похожи.

прокомментировать блоки кода »
Примерно так:
Option Explicit

' Константы из библиотеки Microsoft Excel
'
' В процедурах VBA под Microsoft Excel они предопределены, поскольку там
' подключены в ссылках соответствующие библиотеки,
' а для VBScript/JScript таковой механизм отсутствует (но не в целом для WSH
' — в пакетах заданий .wsf можно указывать ссылки на библиотеки), и константы приходится
' описывать непосредственно в коде «ручками»
Const xlCSV = 6
Const xlWindows = 2

Dim strTemplateFile
Dim strSourceFile
Dim strDestFolder


Dim objFSO
Dim objExcel

Dim objTemplateFile
Dim objSourceFile

Dim i
Dim strDestFile

Dim anyValue


' Путь к файлу шаблона
strTemplateFile = "C:\Мои проекты\0191\Архив\Архив\Шаблон\check.csv"
' Путь к целевому каталогу
strDestFolder = "C:\Мои проекты\0191\Архив\Архив\Итог"

' Если число переданных скрипту аргументов равно единице…
If WScript.Arguments.Count = 1 Then
' …зададим переменной значение первого аргумента
strSourceFile = WScript.Arguments.Item(0)

' Создаём экземпляр объекта класса "Scripting.FileSystemObject"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

' Если файл шаблона существует…
If objFSO.FileExists(strTemplateFile) Then
' Если файл, указанный первым аргументом скрипта, существует…
If objFSO.FileExists(strSourceFile) Then
' Если целевой каталог существует…
If objFSO.FolderExists(strDestFolder) Then
' Создаём экземпляр объекта класса "Excel.Application"
Set objExcel = WScript.CreateObject("Excel.Application")

' Открываем файл шаблона как текст в виде Рабочей книги
objExcel.Workbooks.OpenText strTemplateFile, , , , , , , , , , , , , , , , , True
' Создаём ссылку на эту объект открытой Рабочую книгу — в данный момент она у нас всегда будет одна
Set objTemplateFile = objExcel.Workbooks.Item(1)

' Открываем исходный файл реестра и сохраняем ссылку на объект Рабочей книги
Set objSourceFile = objExcel.Workbooks.Open(strSourceFile, False, True)

' Пробегаемся циклом от 1 до (число строк использованного диапазона Рабочей книги
' исходного файла реестра за вычетом двух строк — заголовка и суммы)
For i = 1 To objSourceFile.Worksheets.Item(1).UsedRange.Rows.Count - 2
With objTemplateFile.Worksheets.Item(1)
' Получили значение из ячейки (i + 1, 5) исходного файла реестра
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 5).Value

' Задали это полученное значение двум диапазонам Рабочей книги файла шаблона
' — нашего будущего целевого файла
.Range("B3").Value = anyValue
.Range("F2").Value = anyValue

' Получили значение из ячейки (i + 1, 6) исходного файла реестра
anyValue = objSourceFile.Worksheets.Item(1).Cells.Item(i + 1, 6).Value

' Задали это полученное значение трём диапазонам Рабочей книги файла шаблона
' — нашего будущего целевого файла
.Range("D3").Value = anyValue
.Range("D4").Value = anyValue
.Range("H3").Value = anyValue

' Посчитали и задали значение ещё одному диапазону Рабочей книги файла шаблона
' — нашего будущего целевого файла
.Range("L3").Value = Round((anyValue * 18) / 118, 1)
End With

' Создали полное имя для нашего будущего целевого файла
strDestFile = objFSO.BuildPath(strDestFolder, objFSO.GetBaseName(strTemplateFile) & "_" & objFSO.GetBaseName(strSourceFile) & "_" & Right("000" & CStr(i), 3) & "." & objFSO.GetExtensionName(strTemplateFile))

' Если целевой файл уже существует в целевом каталоге…
If objFSO.FileExists(strDestFile) Then
' …удаляем его
objFSO.DeleteFile strDestFile, True
End If

' Сохраняем открытую Рабочую книгу шаблона под именем нашего целевого файла
' в формате CSV
objTemplateFile.SaveAs strDestFile, xlCSV, , , , , , , , , , True
Next

' Закрываем открытые Рабочие книги
objSourceFile.Close False
objTemplateFile.Close False

' Завершаем работу приложения Microsoft Excel и очищаем ссылку на экземпляр объекта
objExcel.Quit
Set objExcel = Nothing
Else
WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
WScript.Quit 4
End If
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 3
End If
Else
WScript.Echo "Can't find template file [" & strTemplateFile & "]."
WScript.Quit 2
End If

Set objFSO = Nothing
Else
WScript.Echo "Usage: cscript.exe //nologo """ & WScript.ScriptName & """ <Source file>"
WScript.Quit 1
End If

WScript.Quit 0

jordan_74
10-09-2018, 18:05
Iska,
Вечер добрый!!!! А можно пакетным файлом запускать скрипт, чтобы он все файлы реестра обрабатывал, которые лежат в папке "Реестр" ?

Пробовал этот код, не получилось)

@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0

Iska
10-09-2018, 19:06
jordan_74, а пути:
@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

endlocal
exit /b 0
Вы поменяли на свои? Какой код у Вас получился? Что сообщает пакетный файл при работе? Что сообщает скрипт?

jordan_74
10-09-2018, 20:14
Iska, у меня вот такой код с моими путями.
Скрипт назвал checkCut.vbs


@echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\РЕЕСТР ЧЕКОВ\реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\РЕЕСТР ЧЕКОВ\checkCut.vbs" "%%~i"
)

endlocal
exit /b 0

Iska
10-09-2018, 20:41
jordan_74, и…? Если открыть командную строку и запустить в ней этот пакетный файл, что происходит?

jordan_74
10-09-2018, 21:43
Iska,
Я батник двойным кликом запускаю.
Ошибка вот такая же cscript.exe //nologo "C:\РЕЕСТР ЧЕКОВ\checkCut.vbs" "%%~i"

Iska
10-09-2018, 22:19
Я батник двойным кликом запускаю. »
Не запускайте двойным кликом. Откройте окно консоли командной строки (Win-R, cmd.exe, Enter), впишите путь к пакетному файлу (путь, естественно, должен быть Ваш):
https://i.imgur.com/shmOG1g.png
нажмите Enter, покажите, что получилось.

jordan_74
11-09-2018, 07:05
Iska,
Так все работает да! Спасибо! А я спросил потому, что хочется как в лучших домах, "нажал кнопочку" и готово, чтобы как можно меньше кликов делать) Я думал, что можно запустить батник, и уже он запускает в работу скрипт, который отработает все файлы реестров в папке.

Iska
11-09-2018, 20:58
jordan_74, не должно быть никакой разницы между запуском в командной строке или обычным двойным щелчком. Разве что Вы какие-то коррективы вносили в насройки исполнения пакетных файлов.

Давайте попробуем так — закомментировать @echo off и добавить в конец паузу:
rem @echo off
setlocal enableextensions enabledelayedexpansion

for %%i in ("C:\Мои проекты\0191\Архив\Архив\Реестр\*.xlsx") do (
echo [%%~i]
cscript.exe //nologo "C:\Мои проекты\0191\Архив\Архив\0001.vbs" "%%~i"
)

pause

endlocal
exit /b 0
Попробуйте запустить на исполнение двойным щелчком, покажите получившийся скриншот (только не выкладывайте на Радикал, пожалуйста), посмотрим.

jordan_74
12-09-2018, 17:20
Iska,
Вот что получилось

Iska
12-09-2018, 17:26
jordan_74, замечательно. Убирайте комментарий с первой строки и паузу в конце.

Пакетный файл требуется сохранять в кодировке OEM/866. У Вас это не так, посему и не находится ни единого файла.

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

jordan_74
12-09-2018, 18:13
Iska,
:lol: мне остается посмеяться только над самим собой
Все работает, обычная невнимательность с моей стороны была причиной всему.
Ещё раз огромное спасибо!!!!!!

Iska
12-09-2018, 18:26
jordan_74, ничего страшного, бывает. А вот мне следовало бы зараз догадаться о причинах :(.

jordan_74
20-09-2018, 12:11
Iska,
Добрый день! Я прошу прощения, понадобилось всё таки сделать кол-во знаком после запятой не 1 а 2
Много перерабатывать, где корректировки внести подскажите пожалуйста?

Iska
20-09-2018, 12:27
понадобилось всё таки сделать кол-во знаком после запятой не 1 а 2 »
.Range("L3").Value = Round((anyValue * 18) / 118, 2)

jordan_74
20-09-2018, 12:32
Iska,
Да я уже поправил, спасибо. И теперь встал наверно главный вопрос.
Нужно чтобы скрипт отрабатывал, при этом батник запускающий скрипт и скрипт лежали где то в другом месте, не на компе пользователя
Передавать параметры.
Все для того, чтобы при переносе на другой комп, не приходилось постоянно менять пути в скрипте и батнике.

Iska
20-09-2018, 12:48
jordan_74, поясните более подробно, что Вы имеете в виду.

jordan_74
20-09-2018, 12:55
Iska,
Скрипт, шаблон и батник, который запускает скрипт будут лежать где то в сети.

Пользователь на своём компе будет запускать батник, который активирует(запускает) батник - который запускает в работу скрипт. )) я прошу прощения за такую тавтологию.

У пользователя будет 2 папки - Реестр и Итог, и тот самый батник.

Как это можно осуществить? ) Я полагаю это можно сделать как то с помощью передачи параметров.
В качестве параметров видимо должны быть пути к папке с файлом(ами) реестра, и к папке Итог

Iska
20-09-2018, 20:03
Отнюдь. У нас три составляющих:

путь к файлу шаблона;
путь к целевому каталогу;
путь к исходным файлам.

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

Ваши предложения?

jordan_74
25-09-2018, 11:57
Iska,

Откровенно говоря предложений пока нет.

Можно попытаться использовать команду "psexec" для запуска батника(а затем и скрипта по сети)

//что то в духе

@echo off
psexec \\IP или имя компа\Documents and Settings\User\kill.cmd
exit




© OSzone.net 2001-2012