从CSV到Batch的CSV程序翻译

时间:2011-10-26 19:54:59

标签: python csv batch-file

我真的需要帮助使用批处理文件来执行以下操作:

我需要逐行读取文本文件,对于给定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 个答案:

答案 0 :(得分:3)

我只需编写您需要的批处理文件。但是,我不知道.csv文件格式,所以我假设了几个细节。这些是我的假设:

  • .csv文件只包含没有CR-LF分隔符的ASCII文本。
  • 每个.csv元素用逗号分隔,不要包含空格(此限制可以解决)。
  • 输入.csv文件的大小低于8 KB(在批处理变量中读取其内容时需要)。
  • .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 :(得分:1)

Windows(DOS)批处理语言不适合这种任务。尽管有可能,但最终的脚本肯定会很麻烦,令人费解并且容易混淆。

Python是一个很好的解决方案,并且在帖子中不清楚为什么你不想使用它。如果你担心安装Python,可以考虑py2exe,它允许你创建一个独立的python可执行文件。