2017-08-07 162 views
1

我有一個看起來像這樣的表文件插入空格「」到一個表文件:使用Python來分隔列

3 5415.00 6.00 -1998.3 -781.28 21.98 9.99 3.41 21.63 0.94 1.29 0 -98.04 98.04 
4 6443.00 6.00 -1998.3-1216.10 21.71 0.35 0.38 22.78 8.00 3.00 2 -98.04 98.04 
5 5806.00 7.00 -1997.8 -946.67 21.04 0.19 0.19 23.26 6.27 0.97 0 2.23 -2.23 
6 7882.00 8.00 -1997.4-1824.80 22.18 0.58 0.49 22.62 0.85 0.85 0 0.44 -0.44 
7 3278.00 9.00 -1997.0 122.67 20.94 0.24 0.20 23.53 8.00 0.24 2 -98.04 98.04 

正如你可以看到有超過應採取預期的空間一定的價值和擺脫列之間的空間,導致我的代碼無法讀取文件,指出有比其他列少的列。

一個好處是,我可以知道這種情況發生在哪個確切的列(可能發生在幾個文件中),所以我可以實現一個代碼或函數,將空格插入到文件的每一行的這些列中。

我對寫/讀文件不是很熟悉,所以我猜測上面的想法是解決這個問題的最簡單方法。乾杯。

+0

在創建文件的過程中是否可以對這個問題進行排序?你也關心文件的可讀性嗎?特定的列是否有特定的數字位數? – Laszlowaty

+0

這些文件已經創建並交給我了。我將需要返回這些文件,解決這個問題,所以他們需要有相同的順序。示例中的兩個衝突列可能每個都少一個數字。 –

回答

1

我看到它的方式,如果您不確切知道所有「錯誤」在哪裏,您將不得不閱讀整個文件。

如果這是真的,我會說你的方法(在第n列的每一行添加一個空格)實際上是非常有效的。

我也建議看看Vim的塊狀視覺模式。 例如(從jubi修改):

  1. 轉到你需要
  2. CTRL + V(在視頻模式下輸入)
  3. 使用箭頭鍵選擇行
  4. 移列+ i(帶你進入插入模式)
  5. 點擊空格鍵或任何你想要在選定的行前面輸入的內容。
  6. 保存更改(使用:w),現在您將看到所有選定行中的更改。

這裏的另一種來源:How to insert a block of white spaces starting at the cursor position in vi?

希望工程!

+0

我使用了Vim並按照你的步驟工作,完全按照我的想法工作。雖然滾動~30K線需要一點點(可能有更快的方法來達到底線),但它解決了這個問題就好了。謝謝!我感謝你的時間。 –

1

首先要做的事情。生成文件後無法解決此問題。想象一下,您已將列合併到:6 7882.00 8.00 -1997.41824.80 22.18 0.58 0.49 22.62 0.85 0.85 0 0.44 -0.44。請注意0​​。 沒有辦法將其分成兩列。

這裏最好的辦法將是使用不同的列分隔符的原始文件(文件創建過程中) - 例如;因爲它不是作爲十進制分隔符和CSV文件中是常用的。

只有知道列中有多少數字(這裏不是這種情況,因爲在您提供的示例中有不同數量的數字),解決此問題的第二種方法纔有效。

後,您會收到不同的分隔符的文件數據應該是這樣的:

3;5415.00;6.00;-1998.3;-781.28;21.98;9.99;3.41;21.63;0.94;1.29;0;-98.04;98.04 

然後你可以使用csv庫,pandas.read_csv(),或寫這會看起來像這樣自定義代碼:

file_with_data = open("filename.txt", "r") 
raw_data = file_with_data.read() 
file_with_data.close() 
rows = raw_data.split("\n") #splitting whole file to list containing rows 
for row in rows: 
    print(row.split(";")) # splitting row data into values based on the ; seperator