0

所以,基本上,我需要一个程序来打开一个 .dat 文件,检查每一行以查看它是否满足某些先决条件,如果满足,则将它们复制到一个新的 csv 文件中。

先决条件是它必须 1) 包含“$W”或“$S”,并且 2) 在 DAT 行的末尾具有最后一个值,例如一长串可接受的术语之一。(我可以简单地制作一个术语列表并将它们硬编码到一个列表中)

例如,如果 CSV 是购买信息列表,而最后一项是购买的商品,我只想包括水果。在这种情况下,最后一项是 ID 标签,我只想接受少数几个 ID 标签,但有一个大约 5 个可接受标签的列表。但是,标签的长度非常可观,但它们始终是列表中的最后一项(并且始终是列表中的第 4 项)

让我再举一个更好的例子,还是水果。

我原来的 .DAT 可能是:

DGH$G$H $2.53 London_Port Gyro

DGH.$WFFT$Q5632 $33.54 55n39 Barkdust

UYKJ$S.52UE $23.57 22#3 Apple

WSIAJSM_33$4.FJ4 $223.4 Ha25%ek Banana

只有一行:“UYKJ$S $23.57 22#3 Apple”会被复制,因为只有它同时具有 1)$W 或 $S(在本例中为 $S)和 2)最后一项是水果。制作 .csv 文件后,我将需要返回并用逗号替换所有空格,但这对我来说并不像弄清楚如何扫描每一行的需求并只复制那些被通缉。

我正在制作一些与这个非常相似的程序,它们打开 .dat 文件,检查每一行以查看它们是否符合要求,然后决定是否将它们复制到新文件中。但可悲的是,我不知道我在做什么。它们都很相似,一旦我弄清楚如何制作一个,其余的就很容易了。

编辑:.DAT 文件有几千行,如果这很重要的话。

EDIT2:我当前的一些代码片段

现在,我当前的版本是这样的:

def main():
    #NewFile_Loc = C:\Users\J18509\Documents
    OldFile_Loc=raw_input("Input File for MCLG:")
    OldFile = open(OldFile_Loc,"r")
    OldText = OldFile.read()
#   for i in range(0, len(OldText)):
#       if (OldText[i] != " "):
#           print OldText[i]
    i = split_line(OldText)
    if u'$S' in i:
        # $S is in the line
        print i
main()

但它仍然非常波涛汹涌。我只是在学习python。

简要更新:我正在使用的服务器已关闭,可能会在接下来的几个小时内关闭,但我有我的新代码,其中有语法错误,但无论如何它都在这里。一旦我得到它的工作,我会再次更新。非常感谢大家!

import os
NewFilePath = "A:\test.txt"
Acceptable_Values = ('Apple','Banana')
#Main
def main():
    if os.path.isfile(NewFilePath):
        os.remove(NewFilePath)
    NewFile = open (NewFilePath, 'w')
    NewFile.write('Header 1,','Name Header,','Header 3,','Header 4)
    OldFile_Loc=raw_input("Input File for Program:")
    OldFile = open(OldFile_Loc,"r")
    for line in OldFile:
        LineParts = line.split()
        if (LineParts[0].find($W)) or (LineParts[0].find($S)):
            if LineParts[3] in Acceptable_Values:
                print(LineParts[1], ' is accepted')
                #This Line is acceptable!
                NewFile.write(LineParts[1],',',LineParts[0],',',LineParts[2],',',LineParts[3])
    OldFile.close()
    NewFile.close()
main()
4

5 回答 5

1
inlineRequirements = ['$W','$S']
endlineRequirements = ['Apple','Banana']

inputFile = open(input_filename,'rb')
outputFile = open(output_filename,'wb')
for line in inputFile.readlines():
    line = line.strip()
    #trailing and leading whitespace has been removed
    if any(req in line for req in inlineRequirements):
        #passed inline requirement
        lastWord = line.split(' ')[-1]
        if lastWord in endlineRequirements:
            #passed endline requirement
            outputFile.write(line.replace(' ',','))    
            #replaced spaces with commas and wrote to file
inputFile.close()
outputFile.close()
于 2013-07-23T22:25:26.193 回答
1
tags = ['apple', 'banana']
match = ['$W', '$S']
OldFile_Loc=raw_input("Input File for MCLG:")
OldFile = open(OldFile_Loc,"r")
for line in OldFile.readlines(): # Loop through the file
    line = line.strip() # Remove the newline and whitespace
    if line and not line.isspace(): # If the line isn't empty
        lparts = line.split() # Split the line
        if any(tag.lower() == lparts[-1].lower() for tag in tags) and any(c in line for c in match):
            # $S or $W is in the line AND the last section is in tags(case insensitive)
            print line
于 2013-07-23T22:26:33.617 回答
1

您需要实现两个部分:首先,逐行读取文件并写入满足特定条件的行。这是由

with open('file.dat') as f:
    for line in f:
        stripped = line.strip() # remove '\n' from the end of the line
        if test_line(stripped):
            print stripped # Write to stdout

您要检查的条件在函数中实现test_line。要检查“$W”或“$S”的出现,您可以简单地使用in-Operator

if not '$W' in line and not '$S' in line:
    return False
else:
    return True

要检查该行中的最后一项是否包含在固定列表中,首先使用 分割该行split(),然后使用索引表示法获取最后一项[-1](负索引从序列末尾开始计数),然后in再次使用运算符反对你的固定清单。这看起来像

items = line.split() # items is an array of strings
last_item = items[-1] # take the last element of the array
if last_item in ['Apple', 'Banana']:
    return True
else:
    return False

现在,您将这两个部分组合到test_line函数中,例如

def test_line(line):
    if not '$W' in line and not '$S' in line:
        return False
    items = line.split() # items is an array of strings
    last_item = items[-1] # take the last element of the array
    if last_item in ['Apple', 'Banana']:
        return True
    else:
        return False

请注意,程序将结果写入标准输出,您可以轻松地对其进行重定向。如果要将输出写入文件,请查看Correct way to write line to file in Python

于 2013-07-23T22:22:16.977 回答
0
import os
NewFilePath = "A:\test.txt"
Acceptable_Values = ('Apple','Banana')
#Main
def main():
    if os.path.isfile(NewFilePath):
        os.remove(NewFilePath)
    NewFile = open (NewFilePath, 'w')
    NewFile.write('Header 1,','Name Header,','Header 3,','Header 4)
    OldFile_Loc=raw_input("Input File for Program:")
    OldFile = open(OldFile_Loc,"r")
    for line in OldFile:
        LineParts = line.split()
        if (LineParts[0].find(\$W)) or (LineParts[0].find(\$S)):
            if LineParts[3] in Acceptable_Values:
                print(LineParts[1], ' is accepted')
                #This Line is acceptable!
                NewFile.write(LineParts[1],',',LineParts[0],',',LineParts[2],',',LineParts[3])
    OldFile.close()
    NewFile.close()
main()

这很好用,并且具有我需要的所有功能。其他答案都很好,但没有一个能像这个一样做到我需要的 100%。

于 2013-07-26T21:40:09.223 回答
0
import re
list_of_fruits = ["Apple","Bannana",...]
with open('some.dat') as f:
    for line in f:
        if re.findall("\$[SW]",line) and line.split()[-1] in list_of_fruits:
           print "Found:%s" % line
于 2013-07-23T22:22:30.993 回答