CSV程序从Python到批处理的转换

2024-05-14 23:40:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我需要逐行读入一个文本文件,并且,对于给定的CSV文件的每个条目(以文本文件行中找到的元素开始),将其写入一个新的CSV文件。在

或者,换句话说:

阅读以下内容

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

然后逐行读取以下文本文件:

^{pr2}$

并创建此文件:

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)

Tags: 文件csvinaswithpageopenreader
2条回答

Windows(DOS)批处理语言不适合这种任务。虽然这可能是可能的,但最终的脚本肯定会很麻烦、复杂和令人困惑。在

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

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

  • csv文件只包含ASCII文本,没有CR-LF分隔符。在
  • 每个.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

就这样。请试试看,有什么问题就告诉我。在

编辑

我刚意识到一个错误新建.csv类别放置在分隔的行中。要解决此问题,请进行以下更改:

改变这些线条

^{pr2}$

由这些人

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"

相关问题 更多 >

    热门问题