2009-12-17 28 views
0

我从一个文件,并为分隔符之间的每个数据我需要删除空白阅读,我已经在Jython中建议需要有关重写和字符串操作

写了下面的程序。当我试图重写,它在源文件的末尾重写。

filesrc = open('c:/FILE/split_doc.txt','r+') 
for list in filesrc.readlines(): 
    #split the records by the delimiter 
    fields = list.split(',') 
    list = ",".join([s.strip() for s in fields]) 
    filesrc.writelines(list+"\n") 

filesrc.close() 

所以我做了一些修改和补充file.seek这样我就可以在源代码行改写,它的工作在一定程度上,除了它是在末处加入两个额外的线,这意味着有部分寻求一些问题。

修改后的方案是

filesrc = open('c:/ODI_FILE/split_doc.txt','r+') 
lines=0 
for list in filesrc.readlines(): 
    #split the records by the delimiter 
     fields = list.split(',') 
    list = ",".join([s.strip() for s in fields]) 
    filesrc.seek(lines) 
    filesrc.writelines(list+"\n") 
    lines += len(list+"\n") 

filesrc.close() 

请帮我正确的逻辑。

有额外的空格

52  ,William ,Kudo  ,28/03/199300:00:00 
11,Andrew,  Andersen,22/02/199900:00:00 
12,John  ,Galagers,20/04/200000:00:00 
13,Jeffrey  ,Jeferson,10/06/198800:00:00 
20,Jennie,Daumesnil,28/02/198800:00:00 
21,Steve,Barrot,24/09/199200:00:00 
22,Mary,Carlin,14/03/199500:00:00 
30,Paul,Moore,11/03/199900:00:00 

这是我的错输出

52,William,Kudo,28/03/199300:00:00 
11,Andrew,Andersen,22/02/199900:00:00 
12,John,Galagers,20/04/200000:00:00 
13,Jeffrey,Jeferson,10/06/198800:00:00 
20,Jennie,Daumesnil,28/02/198800:00:00 
21,Steve,Barrot,24/09/199200:00:00 
22,Mary,Carlin,14/03/199500:00:00 
30,Paul,Moore,11/03/199900:00:00 
9500:00:00 
30,Paul,Moore,11/03/199900:00:00 

这里的最后两行不应该来

请建议所需的正确的源文件和更快的方式,因为这是一个示例文件,我将不得不让这个程序为数百万行工作。

有没有办法让while逻辑在while循环中工作呢?

+1

尽量避免像'list'这样的变量名,因为它们会影响内置类型。在这种情况下,它不是一个列表。我会使用“适合......的线路”,因为它能够正确反映内容。 – 2009-12-17 20:03:56

回答

0

随着时间的推移,您的覆盖范围将会被覆盖,但您的最终结果会比原始的结果更短,因此您将获得原始出血的最后X个字符,其中X是原始版本与新版本之间的差异。在这个版本中额外的.seek()和truncate()调用将寻求新输出的结尾并切断文件的其余部分。

filesrc = open('c:/ODI_FILE/split_doc.txt','r+') 
lines=0 
for list in filesrc.readlines(): 
    #split the records by the delimiter 
     fields = list.split(',') 
    list = ",".join([s.strip() for s in fields]) 
    filesrc.seek(lines) 
    filesrc.writelines(list+"\n") 
    lines += len(list+"\n") 
filesrc.seek(lines) 
filesrc.truncate() 
filesrc.close() 
+0

感谢您的工作。 我现在面临另一个问题,当处理500,000行时,我得到了java内存不足错误,我已经更改为512mx,但仍然失败。当我使用while循环工作时,我在使用另一个程序的循环时遇到了同样的问题。 是否有可能更改while循环的程序, 再次感谢您的及时帮助 – kdev 2009-12-17 20:11:50

+0

readlines()会将整个内容读入内存列表中。相反,使用迭代器的问题在于,您在同一个文件中查找(我怀疑会导致迭代器出现问题)。要使用while循环,您需要在文件中使用两个指针并在它们之间寻找。从一个文件读取并写入另一个文件是否可行?这会简化你的任务。 – 2009-12-17 20:25:32

+0

最初我写了另一个文件,但后来我意识到我的要求主要是使用相同的文件名即将到来,它不可能改变文件名,所以我必须读取和写入同一个文件。 – kdev 2009-12-17 20:46:24

1

您不想在阅读时写入同一个文件。这在技术上是可行的,但这条道路充满了麻烦和痛苦。

下面是简单明了的过程中,你应该遵循:

  • 读取整个文件转换成字符串,然后关闭该文件
  • 上换行符的字符串分割成一个列表
  • 过程中每一行删除额外的间距
  • 归队列表转换为字符串
  • 覆盖新清理的数据源文件

如果你不希望加载整个文件到内存中一次,那就试试这个过程:

  • 打开文件进行读取
  • 读一行一行
  • 写清洗线新的临时输出文件时,所有线路都写
  • ,原来的文件删除
  • 重命名临时文件,以原来的名称

我的建议是写两种方式,看看什么有效或无效,哪种方式更快,而不是假设你无法将它全部读入内存,仅仅因为它有数百万行。也许它会工作得很好。

此外,您当然也可以使用while循环进行此项工作。为此,您需要以while循环的形式阅读Python文档并进行一些实验。你如何编写该循环将取决于你如何加载文件:一次全部写入一个字符串,然后分成一个列表,或者直接从文件中逐行写入。对于这两种情况,你怎么知道while循环需要做多少工作,你将如何从一件工作前进到另一件工作,以及如何知道何时完成工作?如果你能回答这些问题,你可以编写你的循环。

+0

对于这个建议我很感兴趣,我会尝试在周围工作 – kdev 2009-12-17 20:19:56

0

这不回答你的问题,但你有没有考虑过不使用jython这样做?

试过Sed