【问题标题】:Translation from Python to Batch for a CSV program从 Python 转换为 CSV 程序的批处理
【发布时间】:2011-10-26 19:54:59
【问题描述】:

在使用批处理文件执行以下操作时,我确实需要帮助:

我需要逐行读取文本文件,并且对于给定 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)

【问题讨论】:

  • 如果你觉得在 Python 中这样做很麻烦,我无法想象你为什么认为批处理文件会更好。你没有其他选择吗,比如 PowerShell?
  • 不这么认为,不。是否没有简单的方法可以像读取文本文件一样读取 CSV 文件并说出类似 1 的内容。检查您所在的对象是否 = 文本文件中的任何文本行 2(如果是)。将对象和所有五个对象写入一个新文件 2(如果没有)。移动 5 个对象并重复。
  • 天哪,windows批处理中的文本处理?你的努力最好花在弄清楚如何让 Python 在你的目标上运行。
  • 您是说 Python 无法在您的系统上运行,还是您的 Python 代码无法运行?您使用的是什么版本的 Windows?即使它是最新的,它也有 PowerShell。即使没有,您仍然很可能拥有 VBScript/JScript 之类的选项,这比批处理要少得多。 (但我的第一选择是 Python。)
  • 您忘了提及您的数据存在 Unicode 问题...

标签: python csv batch-file


【解决方案1】:

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

  • .csv 文件仅包含没有 CR-LF 分隔符的 ASCII 文本。
  • 每个 .csv 元素都以逗号分隔,并且不包含空格(此限制可能已解决)。
  • 输入 .csv 文件的大小低于 8 KB(需要在 Batch 变量中读取其内容)。
  • .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"

【讨论】:

  • 我明天将在公司系统上对其进行全面测试,我们将看看会发生什么!谢谢!
  • 如果 csv 包含感叹号 ! 可能会失败,并且很难解决
  • 数据中没有感叹号。但好点。谢谢大家的帮助和帮助!
【解决方案2】:

Windows (DOS) 批处理语言不适合这种任务。虽然有可能,但生成的脚本肯定很麻烦、令人费解且令人困惑。

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

【讨论】:

  • @jdigital:对不起。在我看来,Batch 解决方案清晰直接,即使不了解 Batch 的人也易于理解...... :(
  • @Aacini,让我们看看其他 StackOverflow 用户对此如何投票。
  • @Aacini:我为你的努力喝彩,我承认你的代码没有我想象的那么可怕(我什至不确定这是否可能)。但它仍然不像几乎任何 Python 解决方案那样容易阅读,而且如果需求发生变化,也更难修改。而且 8 KB 的数据大小限制也是一个非常严格的限制。
  • 我的观点是:没有人可以对他们不知道的事情发表意见。上面的 Python 程序对我来说是模糊的,但这只是意味着我不了解 Python。当然,我并不是说 Batch 比 Python 更好:它不是。我要说的是,很多人认为 Batch 没有价值,因为他们在 20 年前或看到 Batch 发布的其中一个“解决方案”之后的短暂接触。 jdigital 的回答(收到了赞成票!)和 Chriszuma 的评论(获得 3 次赞成票)和您自己证明了我的观点。我只是说:要对 Batch 发表意见,首先要了解它目前的能力。
  • @Aacini:没有人说批次没有价值。我们大多数人都在说在我们看来 Python 将会变得更容易和更快。现在,您将看到您的答案比 jdigital 获得了更多的选票,并且被接受了。那你为什么抱怨?我仍然相信您的解决方案不如使用 Python 灵活。看看你在答案开始时提出的所有假设。在 Python 中,将它们全部删除几乎是微不足道的,而批量删除它们中的一些则很困难或不可能。 (例如,如果输入 CSV 为 8 兆字节会怎样?)
猜你喜欢
  • 2011-07-12
  • 2015-11-14
  • 1970-01-01
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2012-05-06
相关资源
最近更新 更多