2016-01-19 4 views
0

Может ли кто-нибудь помочь мне найти сценарий командного файла, который автоматически удаляет символы TAB и заменяет их ,?Пакетный файл для замены табуляции запятой ","

Например:

61 LEUKOCELL 2      7737 PK25 278 N Y 
97 SNAP COMBO PLUS (FELV/FIV)  9906034 PK15 290.82 N Y 

У меня есть 90k + строки этого в текстовых файлах: я могу автоматизировать переформатирование с помощью пакетного файла с этим:

61,LEUKOCELL 2,7737,PK25,278,N,Y 
97,SNAP COMBO PLUS (FELV/FIV),906034,PK15,90.82,N,Y 
+0

Должен ли это быть файл '.bat' Windows, или вы можете использовать что-то вроде Python или Perl? – Will

+2

Вы можете попробовать [JREPL.bat] dbenham (http://www.dostips.com/forum/viewtopic.php?f=3&t=6044&sid=7c4cc72f296bb6c6400fc9ea1a3669ae), гибрид batch/jscript. Он должен работать на любой текущей системе Windows без дополнительных установок. – jeb

+0

@В файле Windows '.bat', у кого есть ключ? Надеюсь, вы можете помочь мне, ребята. – Maruja

ответ

0
@ECHO OFF 
SETLOCAL 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q34875733.txt" 
SET "outfile=%destdir%\outfile.txt" 
(
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
SET "line=%%a"&call :process 
) 

)>"%outfile%" 
GOTO :EOF 

:process 
SET /a "col1=%line:~0,4%" 
SET "col2=%line:~4,32%" 
SET "col2=%col2:    =%" 
SET "col2=%col2:  =%" 
SET "col2=%col2: =%" 
SET "col2=%col2: =%" 
IF "%col2:~-1%"==" " SET "col2=%col2:~0,-1%" 
FOR /f "tokens=1-5" %%i IN ("%line:~36%") DO ECHO %col1%,%col2%,%%i,%%j,%%k,%%l,%%m 

GOTO :EOF 

Вы должны были бы измените настройки sourcedir и destdir в соответствии с вашими обстоятельствами.

Я использовал файл с именем q34875733.txt, содержащий ваши данные для моего тестирования.

Создает файл, определенный в% выходной_файл%

Предполагая, что ваш макет фиксированной колонки, как описано, и что нет никаких символов в данных, к которым партия показывает чувствительность, повторяя ваши 2 строки в файл с 90k + линий было время работы около 7 минут на моей машине.

Для каждой линии присвоить строку line и процесса с помощью

  • выбора первого 4 столбца в виде числа с col1
  • выбора следующих 32 столбцов col2
  • замены строк 16, 8,4 и 2 пробела на ничего не найдено
  • удаляющий последний символ, если это пробел
  • , токенизирующий часть строки после столбца с использованием разделителей по умолчанию и построение выходной строки.

Замена рутина

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q34875733.txt" 
SET "outfile=%destdir%\outfile.txt" 
SET "tab= " 
(
FOR /f "usebackqtokens=1-7delims=%tab%" %%a IN ("%filename1%") DO (
REM detect missing column 3 
IF "%%g" == "" (ECHO %%a,%%b,,%%c,%%d,%%e,%%f) ELSE (ECHO %%a,%%b,%%c,%%d,%%e,%%f,%%g) 
) 

)>"%outfile%" 
GOTO :EOF 

Посмотрев на свои исходные данные, он apper бы, что колонки выровнены с помощью вкладок и столбец 3 иногда отсутствует (413 denelan)

Следовательно - процедура замены (вам нужно будет переформатировать исходные данные 61 LEUKOCELL 2 в том же формате, который, как вы могли бы использовать для остальной части файла.

Обратите внимание, что символ между кавычками в настройке переменной tab является таблицей Tab, а не строкой пробелов.

Итак, на этот раз разделите строку на 7 столбцов, используя вкладку (или последовательность вкладок) в качестве разделителей; назначьте %% a .. %% g и извергайте. Если столбец 3 отсутствует, %%g будет назначаться (так как имеется короткий столбец), поэтому %%g будет казаться ничего.Если эта ситуация обнаружена, введите пустое поле в качестве столбца 3 (следовательно, ,,)

Я предположил, что все данные содержат либо 7 столбцов, либо 6 столбцов, где отсутствует столбец 3.

+0

Magoo, отлично, я почти решил свою большую проблему. Но дело в том, что это как-то дает мне немного неточные данные, и это не делает то, что мне нужно для всех строк, только для некоторых. Вот скриншот того, что я получил, и код, который я использовал. Скажите, пожалуйста, что случилось? Скриншот - [ссылка] (http: // imgur.com/0fRBnQX) – Maruja

+0

Вы получили мою идею отлично Magoo, не могли бы вы помочь мне понять, как исправить эти проблемы, чтобы получить весь файл, работающий (im действительно начинающий в кодировании), и для запятых, которые все еще смещены.? Скриншот - [ссылка] (http://imgur.com/Rtt20sE) Спасибо Magoo !!! – Maruja

+0

Спасибо Magoo, я попробовал вашу замену - Еще что-то не так, это то, что я получил на этот раз - Скриншот [ссылка] (http://imgur.com/ampohsO) – Maruja

0

Это должно заменить все табуляции запятой.

call jrepl "\t" "," /x /f "input-file.txt" /o "output-file.txt" 

Это использует родной пакетный скрипт для Windows под названием Jrepl.bat написанный dbenham, который использует jscript, чтобы сделать его очень надежным и быстрым.
http://www.dostips.com/forum/viewtopic.php?f=3&t=6044

Разместите его в той же папке, что и командный файл, или в папке, находящейся на системном пути.

Существует также скопировать на Dropbox (разблокировать его после загрузки):
https://www.dropbox.com/s/4otci4d4s8x5ni4/Jrepl.bat

+0

Привет, фоксид, спасибо. Но что мне помещать в одну папку? как и что? Я просто вижу длинный сценарий, но где его скопировать? – Maruja

+0

Команда, показанная выше, заключается в том, чтобы перейти в отдельный командный скрипт или в командной строке. Поместите 'jrepl.bat' в ту же папку или в папку на пути. – foxidrive

+0

Как вы сказали, окно выскользнуло на 0,5 секунды, и ничего страшного не произошло :(Скриншот - [ссылка] (http://imgur.com/RKVRshi) – Maruja

2

Вам не нужно сложных методов для достижения замены так просто, как этот. Маленький пакетный файл заменяет все вкладки запятыми:

@set @a=0 /* 
@cscript //nologo //E:JScript "%~F0" <input.txt> output.txt 
@move /Y output.txt input.txt 
@goto :EOF */ 

WScript.Stdout.Write(WScript.StdIn.ReadAll().replace(/\t/g,",")); 

Сохраните этот код с расширением .BAT.

+0

Ему тоже нужен глобальный переключатель, Антонио, поскольку он заменяет только первый матч. – foxidrive

+0

@foxidrive: Вы правы! Исправлено ... – Aacini

+0

Отлично, спасибо вам, ребята. Умм, еще одна вещь. Можно ли сделать последнее действие, как преобразование этого txt в файл '.csv'? Дело в том, что этот файл '.txt' сделан из файла' .csv'. Он должен быть разделен запятой и сохранен как '.csv'? Это ребята? :) – Maruja

Смежные вопросы