Arhn - архитектура программирования

Пакетный скрипт для чтения текстового файла, разделенного табуляцией, построчно и извлечения одного столбца в новый файл.

У меня есть текстовые файлы из экспортируемых списков воспроизведения iTunes, которые представляют собой массивы, разделенные табуляцией. У них 27 столбцов, но для простоты я включу в пример только четыре:

Name    Artist  My Rating   Location
Pod1    Show1   0           E:\Podcasts\Show1\Episode99.m4a
Pod2    Show2   100         E:\Podcasts\Show2\Show2 Ep 101 - Subtitle.mp3
Pod3    Show2   60          E:\Podcasts\Show2\News 11-17-2014.aicc

И так далее. Мне нужно извлечь только местоположение (которое всегда является последним столбцом) и поместить его в новый текстовый файл, чтобы он выглядел так:

E:\Podcasts\Show1\Episode99.m4a
E:\Podcasts\Show2\Show2 Ep 101 - Subtitle.mp3
E:\Podcasts\Show2\News 11-17-2014.aicc

Вот код, который у меня есть до сих пор для этой цели:

@ECHO OFF

type Podcasts.txt | findstr /v Grouping > Podcasts1.txt
del Podcasts.txt
rename Podcasts1.txt Podcasts.txt

Хотя я нашел несколько отдельных руководств по изменению отдельных строк и построчному чтению текстовых файлов, у меня возникли трудности даже с изменением одной строки так, как мне хотелось бы, не говоря уже о слиянии двух принципов. Я полагаю, что это, вероятно, очень быстрый ответ, который я просто не ищу, чтобы найти.

Я обнаружил, что можно получить нужные мне результаты в Notepad++, используя следующий REGEX:

Find: .+(E\:)
Replace: \1

Поэтому способ сделать это построчно в пакетном сценарии был бы полезен.

Бонус: я использую полученный файл в качестве белого списка для удаления файлов, которых нет в списке воспроизведения. Если у вас есть ссылка или вы можете написать небольшой код, это поможет. В противном случае у меня есть идеи о том, как я планирую добиться этого, что потребует использования одной папки.

EDIT: я обнаружил, что, поскольку некоторые столбцы пусты, используя это:

for /f "usebackq tokens=1-26,* delims=  " %%a in ("Podcasts.txt") do (
   echo %%q >> PodcastsTest.txt
)

Иногда попадает не в ту колонку. Мне нужно что-то, что может либо искать два символа «E:» и действовать оттуда, либо чтобы поиск строки шел справа налево при поиске первой вкладки.

Быстрый и грязный метод, который я только что создал, который ищет обратную косую черту (которая в настоящее время появляется только в Location), выглядит следующим образом:

for /f "usebackq tokens=1,* delims=\" %%a in ("Podcasts.txt") do (
    echo E:\%%b >> PodcastsTest.txt
) 

Это небезопасный метод, поскольку ничто не мешает некоторым другим полям иметь обратную косую черту, но как временное решение оно работает.

Я обнаружил, что Linux SED доступен для Windows. Может быть, есть способ адаптировать для него следующий поиск Notepad ++ REGEX?

Find: .+(E\:)
Replace: \1

  • Возможный дубликат копировать столбец в .csv файл в другой с помощью пакетного и других, найденных с помощью [batch-file] csv копировать столбец. Укажите после delims= горизонтальный символ табуляции в пакетном файле, а FOR разделяет значения поля только символом табуляции вместо пробелов и табуляции, как по умолчанию. Запустите в окне командной строки for /? и прочитайте все выходные страницы справки для получения подробной информации об этой команде. 06.09.2015

Ответы:


1

Это новое решение, основанное на ограничениях исходных данных и дополнительной информации, добавленной в вопрос, а также на согласии использовать другой инструмент:

call jrepl ".*(E:.*)" "$1" /i /f "Podcasts.txt" /o "Podcasts2.txt"

В приведенном выше коде используется собственный пакетный сценарий Windows под названием Jrepl.bat (от dbenham)
jrepl.bat можно загрузить по адресу: https://www.dropbox.com/s/4otci4d4s8x5ni4/Jrepl.bat
, а также здесь: http://www.dostips.com/forum/viewtopic.php?f=3&t=6044

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

Часть 2

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

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

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

@echo off
(
for %%a in (*.*) do (
   if /i not "%%~nxa"=="%~nx0" if /i not "%%~nxa"=="Podcasts2.txt" find /i "\%%~nxa" < "Podcasts2.txt" >nul || echo del "%%a"
)
)>delfiles.bat.txt"

Ниже показано базовое решение с данными во всех ячейках файла с разделителями табуляции

Без файла я не могу быть уверен, что он имеет правильный столбец, но метод должен работать.

Замените TAB буквальным символом табуляции в редакторе, который не преобразует TAB в пробелы, например в Блокноте.

@echo off
for /f "usebackq tokens=1-26,* delims=TAB" %%a in ("Podcasts.txt") do (
   echo %%b
)
pause
05.09.2015
  • Это хорошее начало, которое привело к небезопасному исправлению. Я отредактировал вопрос, чтобы включить в него свои проблемы. 07.09.2015
  • @LawrencePell В этом ответе есть новый раздел 07.09.2015

  • 2

    Вот чисто пакетное решение, основанное на предположении, что желаемое местоположение всегда начинается с E:\ (без учета регистра), и эта строка не должна встречаться ни в одном из предыдущих столбцов:

    @echo off
    setlocal disableDelayedExpansion
    >"Podcasts.txt.new" (
      for /f "usebackq skip=1 delims=" %%A in ("Podcasts.txt") do (
        set "ln=%%A"
        setlocal enableDelayedExpansion
        echo !ln:*E:\=E:\!
        endlocal
      )
    )
    

    Если вы знаете, что ни одно место не содержит !, то вы можете просто один раз включить отложенное расширение вверху и удалить SETLOCAL и ENDLOCAL из цикла.

    Регулярное выражение — отличный способ получить последний столбец независимо от содержимого. Хорошей утилитой регулярных выражений для пакетной обработки является JREPL.BAT. Утилита, основанная на чистом скрипте (гибрид JScript/batch), которая изначально запускается на любом компьютере с Windows, начиная с XP.

    Следующий JREPL one liner работает хорошо:

    jrepl "[^\t]+$" $0 /jmatch /jbegln "skip=(ln==1)" /f "Podcasts.txt" /o "Podcasts.txt.new"
    

    Вот еще одно решение JREPL:

    jrepl ".*\t" "" /a /jbegln "skip=(ln==1)" /f "Podcasts.txt" /o "Podcasts.txt.new"
    

    Примечание. Вы должны использовать CALL JREPL, если используете решение JREPL в пакетном сценарии.

    Это последнее регулярное выражение можно использовать с sed:

    sed "1d;s/.*\t//" "Podcasts.txt" >"Podcasts.txt.new"
    
    07.09.2015
  • РЕДАКТИРОВАТЬ. Исправлены оба решения для пропуска первой строки (строки заголовка). Также исправлено решение JREPL, чтобы не печатать пустые строки между местоположениями. 07.09.2015
  • РЕДАКТИРОВАТЬ 2. Добавлен еще один параметр JREPL, а также решение sed, использующее то же регулярное выражение. 07.09.2015

  • 3

    с sed и несколькими предположениями

    PathTocygwin/sed -e '\#.*[[:blank:]]\([A-Z]:/.*$# !d' -e 's//\1/' Podcasts.txt > Podcasts1.txt
    del Podcasts.txt
    rename Podcasts1.txt Podcasts.txt
    

    предположение здесь - путь использует картографический диск - в столбцах с 1 по 25 нет предыдущего пути - оставьте только строку, соответствующую шаблону

    07.09.2015
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..