2009-08-13 42 views
1

我有一個文件至極擁有約12米永線快速路,每條線路是這樣的:到行/行號添加到文本文件

0701648016480002020000002030300000200907242058CRLF

什麼我想要完成的是在數據之前添加行號,數字應具有固定的長度。

這個背後的想法是能夠將該文件批量插入到SQLServer表中,然後使用它執行某些操作,要求每行都有唯一的標識符。我已經在數據庫端嘗試過這樣做了,但是我還沒有能夠完成一個好的性能(至少在4以下,而在1以下是理想的)。

現在我正在嘗試在python中看起來像這樣的解決方案。

file=open('file.cas', 'r') 
lines=file.readlines() 
file.close() 
text = ['%d %s' % (i, line) for i, line in enumerate(lines)] 
output = open("output.cas","w") 
output.writelines(str("".join(text))) 
output.close() 

我不知道這是否會工作,但它會幫助具有它將如何執行和副作用之前,我一直在嘗試新事物的想法,我也想過用C做這樣我有更好的內存控制。

它是否有助於以低級語言進行操作?有誰知道更好的方式來做到這一點,我很確定它已經完成,但我一直無法找到任何東西。

謝謝

+0

你有沒有試過把一小塊數據(可能是100行)複製到臨時文件並測試你的解決方案? – Jason 2009-08-13 19:59:07

+0

先試一下小樣本.cas文件。不要浪費時間重複複製1200萬行。 – mcandre 2009-08-13 19:59:46

+0

每行是固定大小嗎?如果是這樣,只是存儲器映射文件,並將您的位置設置爲計算出的偏移量 – hova 2009-08-13 20:01:13

回答

4

哦,上帝不要,一次不要讀所有1200萬行!如果你打算使用Python,至少這樣做:

file = open('file.cas', 'r') 
try: 
    output = open('output.cas', 'w') 
    try: 
     output.writelines('%d %s' % tpl for tpl in enumerate(file)) 
    finally: 
     output.close() 
finally: 
    file.close() 

這使用一個生成器表達式,它貫穿整個文件一次處理一行。

+0

哈哈謝謝。有沒有一種方法可以通過部件讀取python中的文件?或者以更低級別的方式工作。這是我一直在考慮用C編寫的文件。 謝謝 – 2009-08-13 20:11:26

+0

David的方法確實按部分讀取文件 - 它每次讀取和寫入一行文件。 – 2009-08-13 20:20:30

+0

是的,安迪的權利 - 雖然它一次只讀一行的事實在Python voodoo中被深深僞裝;-)或者至少它看起來像巫術,如果你不習慣它。 – 2009-08-13 20:57:57

2

你爲什麼不試試貓-n?

+0

我一定會嘗試它,但現在我不能使用貓。 – 2009-08-13 21:47:26

+0

好的,那麼大衛提出的解決方案是好的,雖然plafayette指出,它可能比貓慢。 – 2009-08-13 21:56:15

+0

我剛剛完成少量樣本(2M記錄)的測試,並且兩種解決方案(您的和大衛的)都需要精確的時間來運行。明天我會測試12M會發生什麼,但我沒有預料到很大的區別。 謝謝 – 2009-08-13 23:53:10

2

斯蒂法諾是正確的:

$時間貓-n file.cas> output.cas

使用時間只是讓你可以看到它是多麼快。它會比python更快,因爲cat是純C代碼。