Tôi có một cây kế toán được lưu trữ với indents/không gian trong nguồn:Làm thế nào để phân tích hệ thống phân cấp dựa trên indents với python
Income
Revenue
IAP
Ads
Other-Income
Expenses
Developers
In-house
Contractors
Advertising
Other Expenses
Có một số cố định của các cấp, vì vậy tôi muốn san bằng hệ thống phân cấp bằng cách sử dụng 3 lĩnh vực (số liệu thực tế có 6 cấp, đơn giản hóa ví dụ):
L1 L2 L3
Income
Income Revenue
Income Revenue IAP
Income Revenue Ads
Income Other-Income
Expenses Developers In-house
... etc
tôi có thể làm điều này bằng cách kiểm tra số lượng chỗ trước tên tài khoản:
for rownum in range(6,ws.max_row+1):
accountName = str(ws.cell(row=rownum,column=1).value)
indent = len(accountName) - len(accountName.lstrip(' '))
if indent == 0:
l1 = accountName
l2 = ''
l3 = ''
elif indent == 3:
l2 = accountName
l3 = ''
else:
l3 = accountName
w.writerow([l1,l2,l3])
Có cách nào linh hoạt hơn để đạt được điều này dựa trên sự thụt dòng của hàng hiện tại so với hàng trước thay vì giả sử nó luôn luôn là 3 khoảng trống cho mỗi cấp? L1
sẽ không có thụt lề, và chúng ta có thể tin tưởng rằng các mức thấp hơn sẽ được thụt lề xa hơn cha mẹ của chúng, nhưng có lẽ không phải lúc nào cũng có 3 khoảng trống cho mỗi cấp độ.
Cập nhật, kết thúc với điều này là thịt logic, vì cuối cùng tôi muốn danh sách tài khoản có nội dung, có vẻ dễ nhất chỉ cần sử dụng thụt lề để quyết định có đặt lại, nối hoặc pop danh sách:
if indent == 0:
accountList = []
accountList.append((indent,accountName))
elif indent > prev_indent:
accountList.append((indent,accountName))
elif indent <= prev_indent:
max_indent = int(max(accountList,key=itemgetter(0))[0])
while max_indent >= indent:
accountList.pop()
max_indent = int(max(accountList,key=itemgetter(0))[0])
accountList.append((indent,accountName))
Vì vậy, tại mỗi hàng đầu ra, danh sách tài khoản hoàn tất.
Cảm ơn cho điều này, tôi rốt cuộc muốn để có thể sản xuất các hệ thống phân cấp tại mỗi hàng cùng với các nội dung của dòng, vì vậy tôi sửa đổi một chút, nhưng điều này đã cho tôi đi đúng hướng. –