Trích xuất dữ liệu từ các chuỗi có cấu trúc trong python

Trích xuất dữ liệu từ các chuỗi có cấu trúc trong python

Trích xuất dữ liệu từ các chuỗi có cấu trúc trong python

Trong nhiều tác vụ tự động, chúng ta sẽ cần xử lý văn bản đầu vào có cấu trúc theo một định dạng đã biết và trích xuất thông tin có liên quan. Ví dụ: một bảng tính có thể xác định một tỷ lệ phần trăm trong một đoạn văn bản (chẳng hạn như 37,4%) và chúng ta muốn truy xuất nó ở định dạng số để áp dụng nó sau này (0,374, dưới dạng số thực).

Trong bài viết này, chúng ta sẽ tìm hiểu cách xử lý nhật ký bán hàng chứa thông tin về một sản phẩm, chẳng hạn như sản phẩm đã được bán chưa, giá cả, lợi nhuận thu được và các thông tin khác.

Bắt đầu

Hãy tưởng tượng rằng ta cần phân tích cú pháp thông tin được lưu trữ trong nhật ký bán hàng. Ta sẽ sử dụng nhật ký bán hàng với cấu trúc sau:

[<Timestamp in iso format>] – SALE – PRODUCT: <product id> – PRICE: $<price of the sale>

Ví dụ: một nhật ký có thể trông như thế này:

[2020-12-20T10:58:41.504054] – SALE – PRODUCT: 1345 – PRICE: $09.99

Lưu ý rằng giá có số 0 ở đầu. Tất cả giá sẽ có hai chữ số cho đô la và hai cho xu.

Thực hiện như thế nào … ?

1. Import những thư viện cần thiết và nhập log vào chuỗi

>>> import delorean
>>> from decimal import Decimal
>>> log = '[2020-12-20T11:07:12.267897] - SALE - PRODUCT: 1345 - PRICE: $09.99'

2. Chia nhật ký thành các phần của nó, được chia bởi dấu – (lưu ý khoảng trắng trước và sau dấu gạch ngang). Chúng tôi bỏ qua phần SALE vì nó không thêm bất kỳ thông tin liên quan nào:

>>> divide_it = log.split(' - ')
>>> timestamp_string, _, product_string, price_string = divide_it

3. Phân tích timestamp thành một đối tượng datetime

>>> timestamp = delorean.parse(timestamp_string.strip('[]'))

4. Phân tích product_id thành số nguyên

>>> product_id = int(product_string.split(':')[-1])

5. Phân tích price thành kiểu Decimal

>>> price = Decimal(price_string.split('$')[-1])

6. Lúc này, ta đã có đủ các giá trị cần thiết vào các biến

>>> timestamp, product_id, price
(Delorean(datetime=datetime.datetime(2020, 12, 20, 11, 7, 12, 267897), timezone='UTC'), 1345, Decimal('9.99'))

Hoạt động như thế nào … ?

Công việc cơ bản là tách riêng từng phần tử và sau đó phân tích cú pháp chúng thành kiểu thích hợp. Bước đầu tiên là chia toàn bộ nhật ký thành các phần nhỏ hơn. Chuỗi – là một dải phân cách tốt, vì nó chia nó thành bốn phần — một phần là dấu thời gian, một phần chỉ có từ SALE, sản phẩm và giá.

Trong trường hợp dấu thời gian, chúng ta cần tách định dạng ISO, định dạng này nằm trong ngoặc đơn trong nhật ký. Đó là lý do tại sao dấu thời gian có dấu ngoặc vuông bị loại bỏ khỏi nó. Chúng ta sử dụng mô-đun delorean để phân tích cú pháp nó thành một đối tượng datetime.

Để tách ID sản phẩm, chúng ta chia phần sản phẩm ở dấu hai chấm. Sau đó, lấy phần tử cuối cùng dưới dạng số nguyên:

>>> product_string.split(':')
['PRODUCT', ' 1345']
>>> int(' 1345')
1345

Để phân chia giá, ta sử dụng ký hiệu đô la làm dấu phân tách và phân tích cú pháp nó thành dạng Decimal:

>>> price_string.split('$')
['PRICE: ', '09.99']
>>> Decimal('09.99')
Decimal('9.99')

Leave a Reply