2011-10-26 56 views
0

我真的需要使用批处理文件有助于做到以下几点:翻译到批处理的CSV程序

我需要按行文本文件中的行读取,并且对于给定的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无法实现)。如果你想看到代码,你可以通过我的个人资料点击我的问题,但他们不关心这件事。我剩下要做的就是这样,我要求澄清和想法,因为我的优势不在于英美烟草公司,而在于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

如果你认为在Python这样做很麻烦,我想不通为什么你认为批处理文件会更好。你有没有其他的选择,比如PowerShell? – jdigital

+0

不要这样想,不。是否没有简单的方法来读取CSV文件,就像文本文件一样,并且说出类似于1.检查您所在的对象是否=文本文件2中的任何文本行(如果是)。将对象和所有五个对象写入新文件2(如果否)。移动5个对象并重复。 –

+3

哦,上帝,Windows批处理文本处理?在确定如何让Python在你的目标上运行的过程中,你的努力会更好。 – Chriszuma

回答

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 

这就是它。请尝试一下,让我知道你遇到的任何问题。

EDIT

我只是意识到错误的:所述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" 
+0

我将在公司系统的明天进行全面测试,我们将看到会发生什么!谢谢! –

+0

如果csv包含感叹号'!',那么它可能会失败,并且很难解决这个问题 – jeb

+0

数据中没有感叹号。但好点。谢谢大家的帮助和帮助! –

1

的Windows(DOS)批处理语言是不适合这种类型的任务。虽然这可能是可能的,但所产生的脚本肯定是麻烦的,令人费解的,并且令人困惑。

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

+0

重访该选项。 –

+0

@jdigital:对不起。在我看来,批处理解决方案清晰直接,即使不知道批处理的人也能轻松跟踪... :( – Aacini

+0

@Aacini,让我们来看看其他StackOverflow用户如何对此投票。 – jdigital