Вставьте строку заголовка в CSV, используя SED / VBS - PullRequest
1 голос
/ 23 марта 2020

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

Мне нужно, чтобы это работало на Windows и он использовался ранее для простой замены в файле .csv, теперь мне нужно вставить строку заголовка .

У меня есть файл 'fixit.cmd' , который содержит это;

set batdir=C:\Sed\filepath\batch
set impdir=C:\Sed\filepath\import
set filename=xxx

:: to read as parameter, uncomment next line
:: set filename=%1

cscript //NoLogo %batdir%\sed.vbs 1i"ABC,123" < %impdir%\%filename%.csv > %impdir%\%filename%_fixed.csv
pause

У меня есть файл 'sed.vbs' , который содержит это;

Dim pat, patparts, rxp, inp
pat = WScript.Arguments(0)
patparts = Split(pat,"/")
Set rxp = new RegExp
rxp.Global = True
rxp.Multiline = False
rxp.Pattern = patparts(1)
Do While Not WScript.StdIn.AtEndOfStream
  inp = WScript.StdIn.ReadLine()
  WScript.Echo rxp.Replace(inp, patparts(2))
Loop

Когда я запускаю 'fixit.cmd' , я получаю сообщение об ошибке;

sed.vbs(7, 1) Microsoft VBScript runtime error: Subscript out of range: '[number: 1]'

Я предполагаю, что это указывает на 'sed.vbs' только контент поддерживает предыдущую замену и / или строку вставки строки моего заголовка неверна.

Какие изменения необходимо внести в содержимое 'sed.vbs' и / или моя строка заголовка вставьте строку для успешного вставки строки заголовка ?

Будет очень признателен за любую / все поддержку.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Измените ваш пакетный файл следующим образом:

set "batdir=C:\Sed\filepath\batch"
set "impdir=C:\Sed\filepath\import"
set "filename=xxx"

REM to read as parameter, uncomment next line
REM set filename=%1

>%temp%\header.txt echo ABC,123
copy /b "%temp%\header.txt" + "%impdir%\%filename%.csv" "%impdir%\%filename%_fixed.csv"
pause

Файл VBS больше не нужен.

Некоторые примечания об изменениях, которые я сделал:

  • используется предпочтительный синтаксис для команды set (предотвращает использование случайных пробелов или некоторых специальных символов
  • Команда комментария: REM. :: - это неправильно сформированная метка (которая работает в большинстве случаев, но вас укусит) в некоторых случаях.
  • цитирование путей (предпочтительный синтаксис, чтобы избежать ошибок с пробелами или некоторыми специальными символами в именах файлов или имен файлов)

Строка >%temp%\header.txt echo ABC,123 создает файл с заголовком line.

Команда copy объединяет два файла (заголовок и ваш файл), как @ luciole75w уже написал в комментарии.

0 голосов
/ 24 марта 2020

Файл VBS здесь бесполезен, вы можете удалить его. Ваш fixit.cmd файл может выглядеть так:

@echo off

rem  environment variables set after setlocal will be discarded on exit instead
rem  of possibly altering the parent process (optional but good practice)
setlocal

set header_path="C:\Sed\filepath\batch\header.txt"

rem  ~ removes quotes if any, so that input_path is always quoted no matter if
rem  the argument is quoted or not (optional, easier to deal with spaces in paths)
set input_path="%~1"

rem  optional checking
if %input_path%=="" echo missing input file path & exit /b 1

rem  dpn = (d)rive + (p)ath + (n)ame, i.e. full path of input file without extension
set output_path="%~dpn1_fixed.csv"

rem  concatenate header + input to output
copy /b %header_path% + %input_path% %output_path% >nul

Этот пакетный файл вызывается с входным путем csv в качестве аргумента (абсолютный или относительный путь, включая расширение). Теперь, если вы предпочитаете генерировать заголовок на лету, вы можете заменить последнюю строку (copy...) на:

rem  column names including special characters (&, |, < or >) must be quoted
rem  the special character % must be doubled
set header="A|B=>C",50%%

rem  write the header to the output (overwrite the file if it already exists)
rem  parentheses are one way to avoid trailing spaces when redirecting
(echo %header%) > %output_path%

rem  concatenate input to output
type %input_path% >> %output_path%
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...