我有一個獨特的用例。我有一個以下格式的txt檔案,其中每一行都以“APA”開頭并以“||”結尾 (長短不一,內容不一,無所謂)
APA lEDGER|5023|124223|STAFF NAME|XYZ|123||
APA lEDGER|5023|124223|STAFF NAME|XYZ|131|12r2gw||
APA lEDGER|5023|124223|STAFF NAME|XYZ|43s|12|123sdfq|prime||
然而,在某些行中,由于未知原因,其中一些行被拆分如下:
APA lEDGER|5023|hello|
40937 / 903.01
for period: 2021|8|332.48||
從技術上講,這條線應該是這樣的:
APA lEDGER|5023|hello|40937 / 903.01 for period: 2021|8|332.48||
該檔案非常大(16MB),這是我提出的邏輯:
將每一行讀入一個字串串列并應用以下演算法:
pattern = re.compile("\s*[^APA]")
patternOK = re.compile("\s*[APA]")
final_list = [] --list to store the cleaned strings
ptr=0
for elem in string_list:
if(elem.startswith ("APA") and elem.endswith("||")):
final_list.append(elem) --add each string with the proper format to the the final list
--maintain a pointer, point it to the current string and one to the previous string, if the current string does not start with an APA then append all the strings in a while loop and then append it back to the previous proper string
if(ptr<len(string_list)):
if (ptr - 1 >= 0):
prev_el = str(string_list[ptr-1])
curr_el = str(string_list[ptr])
if(pattern.match(curr_el.strip())):
while (pattern.match(string_list[ptr])):
prev_el = prev_el '|' string_list[ptr]
ptr = ptr 1
if(ptr 1 > len(string_list)):
break
final_list.append(prev_el) --append the cleaned string to the final list
ptr = timer 1
大多數情況下,它有效。但是,我可以看到某些結果在插入的順序中被省略或沒有。也請隨意提供您自己的邏輯。
總之,我需要一個具有上述正確格式的字串串列。
謝謝
uj5u.com熱心網友回復:
看起來你不僅||在行尾,而且在列之間。如果這是一個錯字,普通.split()函式就足夠了,但是如果不是,您可以使用re.split()僅||在行尾拆分。然后,從結果串列元素中洗掉換行符,最后將所有內容重新連接在一起:
import re
data = """APA lEDGER|5023|124223|STAFF NAME|XYZ|123||
APA lEDGER|5023|124223|STAFF NAME|XYZ|131|12r2gw||
APA lEDGER|5023|124223|STAFF NAME|XYZ|43s|12|123sdfq||prime||
APA lEDGER|5023|hello|
40937 / 903.01
for period: 2021|8|332.48||
"""
r = re.compile(r'\|\|$', re.M)
splits = re.split(r, data)
clean_lines = (line.replace('\n', ' ').strip() for line in splits)
clean_file = '||\n'.join(clean_lines)
print(clean_file.splitlines())
輸出:
['APA lEDGER|5023|124223|STAFF NAME|XYZ|123||',
'APA lEDGER|5023|124223|STAFF NAME|XYZ|131|12r2gw||',
'APA lEDGER|5023|124223|STAFF NAME|XYZ|43s|12|123sdfq||prime||',
'APA lEDGER|5023|hello| 40937 / 903.01 for period: 2021|8|332.48||']
uj5u.com熱心網友回復:
你可以使用一些技巧,就像這樣。
[輸入]
text = """APA lEDGER|5023|124223|STAFF NAME|XYZ|123||
APA lEDGER|1178|124223|STAFF NAME|XYZ|131|12r2gw||
APA lEDGER|9845|hello|
40937 / 903.01
for period: 2021|8|332.48||
APA lEDGER|9954|124223|STAFF
NAME|XYZ|43s|12|
123sdfq|
prime||
APA lEDGER|3649|124223|STAFF NAME|XYZ|123||
"""
[代碼]
# One line to split,replace and join.
output= ''.join(text).replace('\n','').replace('||','||#').split('#')
# Print the output
print(output)
# Save the output to a file
with open('Output.txt', 'w') as f:
for item in output:
f.write(f"{item}\n")
f.close()
[輸出]
APA lEDGER|5023|124223|STAFF NAME|XYZ|123||
APA lEDGER|1178|124223|STAFF NAME|XYZ|131|12r2gw||
APA lEDGER|9845|hello|40937 / 903.01for period: 2021|8|332.48||
APA lEDGER|9954|124223|STAFFNAME|XYZ|43s|12|123sdfq|prime||
APA lEDGER|3649|124223|STAFF NAME|XYZ|123||
uj5u.com熱心網友回復:
file = open("file.txt.", "r")
file_out = open("file_out.txt", "w")
lines = file.readlines()
file.close()
my_line = ""
for line in lines:
if (str(line.replace("\n", "")[-1]) str(line.replace("\n", "")[-2])) != "||":
my_line = line.replace("\n", "")
else:
my_line = line.replace("\n", "")
file_out.write(my_line "\n")
my_line = ""
file_out.close()
我認為這應該有效。
它將檢查該行是否以“||”結尾。如果不是,它將存盤該行并移動到下一個。如果下一個包含“||” 最后,它會將其寫入輸出檔案,否則它也會向前移動。
我曾經.replace("\n", "")洗掉潛在的換行符。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/367114.html
上一篇:如何在C中替換不同長度的子字串?
