Перевод с Python на пакет для программы CSV - PullRequest
0 голосов
/ 26 октября 2011

Мне действительно нужна помощь с использованием командного файла, чтобы сделать следующее:

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

Или, другими словами:

Прочитайте следующее

example.csv
Page, Pageviews, Bounce Rate, /category/apples, 1029, 67%, /category/brussel-sprout, 3409, 92%, /category/orange, 1233, 87%

Затем прочитайте следующий текстфайл построчно:

example.txt
/category/apples
/category/orange

И создайте этот файл:

new.csv
Page, Pageviews, Bounce Rate, /category/apples, 1029, 67%, /category/orange, 1233, 87%

До сих пор я работал над этим проектом через пакетный файл, который принимает каждый отдельный адрес списка,проверяет, имеет ли он определенный заголовок, а затем записывает расширение в список.К сожалению, этого недостаточно, поскольку мне также необходимо затем восстановить таблицы из исходного CSV - но только те, которые имеют заголовок.Я пытался сделать это через Python, но это оказалось слишком громоздким (и системные ограничения сделали невозможным писать Python, так или иначе).Если вы хотите увидеть код, вы можете нажать на мои вопросы в моем профиле, но они не относятся к этой части.Осталось сделать вот что, и я прошу ясности и идей, так как мои сильные стороны не в BAT, а в C ++ (и нет, это не вариант).

Спасибо за помощь.Это сообщество (за некоторым исключением) оказалось отличным основанием для извлечения ценных уроков и подталкивания меня к успеху.

Вот куда я направлялся с Python:

import csv

lines = []
with open('output.txt','r') as f:
    for line in f.readlines():
        lines.append(line[:-1])

with open('corrected.csv','w') as correct:
    writer = csv.writer(correct, dialect = 'excel')
    with open('input.csv', 'r') as mycsv:
        reader = csv.reader(mycsv)
        for row in reader:
            if row[0] not in lines:
                writer.writerow(row)

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Я просто пишу нужный вам пакетный файл.Однако я не знаю формат файла .csv, поэтому я предположил несколько деталей.Вот мои предположения:

  • Файл .csv содержит только текст ASCII без разделителей CR-LF.
  • Каждый элемент .csv отделяется запятой И НЕ СОДЕРЖИТ ПРОСТРАНСТВ (этоограничение может быть устранено).
  • Размер входного файла .csv меньше 8 КБ (требуется для чтения его содержимого в переменной пакета).
  • Данные .csv состоят из группиз 3 элементов: заголовок с 3 элементами и каждая категория с 3 элементами.
  • Как категории в файле .csv, так и строки в файле .txt располагаются в порядке возрастания ASCII.
  • Категории в файле .txt включены в .csv.

Это пакетный файл:

@echo off
setlocal EnableDelayedExpansion
rem Read .csv data and split/store its elements in csv array.
set /P csv_data=< example.csv
set i=0
for %%e in (!csv_data!) do (
    set /A i+=1
    set csv[!i!]=%%e
)
rem Create the new.csv file with its header.
echo %csv[1]%, %csv[2]%, %csv[3]%> new.csv
rem Process each line of the text file.
set i=1
for /F %%l in (example.txt) do call :SeekAndWriteCsv %%l
goto :eof

:SeekAndWriteCsv
rem Seek the matching csv category.
set /A i+=3
if not !csv[%i%]! == %1 goto SeekAndWriteCsv
rem Write the matching category to the new.csv file.
set /A j=i+1, k=i+2
echo , !csv[%i%]!, !csv[%j%]!, !csv[%k%]!>> new.csv

Вот и все.Пожалуйста, попробуйте и сообщите мне любую проблему, которую вы получите.

РЕДАКТИРОВАТЬ

Я только что понял ошибку: категории new.csv помещены в отдельные строки.Чтобы исправить это, внесите следующие изменения:

Измените эти строки

rem Create the new.csv file with its header.
echo %csv[1]%, %csv[2]%, %csv[3]%> new.csv

на эти

rem Create the new.csv file with its header.
echo/> enter.txt
set /P dummy=%csv[1]%, %csv[2]%, %csv[3]%< enter.txt > new.csv

Измените эту строку

echo , !csv[%i%]!, !csv[%j%]!, !csv[%k%]!>> new.csv

этим

set /P dummy=, !csv[%i%]!, !csv[%j%]!, !csv[%k%]!< enter.txt >> new.csv

Кроме того, чтобы избежать ошибок с некоторыми специальными символами, вставьте в эту строку кавычки

    set csv[!i!]=%%e

таким образом

    set "csv[!i!]=%%e"
1 голос
/ 27 октября 2011

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

Python - хорошее решение, и в публикации не ясно, почему вы не хотите его использовать.Если ваша проблема заключается в установке Python, рассмотрите py2exe , который позволяет вам создать автономный исполняемый файл python.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...