Python xóa n dòng đầu tiên khỏi tệp csv

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách phân tích cú pháp các giá trị từ các tệp Giá trị được phân tách bằng dấu phẩy (CSV) bằng nhiều tiện ích tích hợp Bash khác nhau

Đầu tiên, chúng ta sẽ thảo luận về các điều kiện tiên quyết để đọc các bản ghi từ một tệp. Sau đó, chúng ta sẽ khám phá các kỹ thuật khác nhau để phân tích tệp CSV thành các biến Bash và danh sách mảng

Cuối cùng, chúng tôi sẽ kiểm tra một số công cụ của bên thứ ba để phân tích cú pháp CSV nâng cao

2. điều kiện tiên quyết

Hãy xem xét ngắn gọn các tiêu chuẩn được xác định cho tệp CSV

  1. Mỗi bản ghi nằm trên một dòng riêng biệt, được phân cách bằng dấu ngắt dòng
  2. Bản ghi cuối cùng trong tệp có thể hoặc không thể kết thúc bằng ngắt dòng
  3. Có thể có một dòng tiêu đề tùy chọn xuất hiện dưới dạng dòng đầu tiên của tệp có cùng định dạng với các dòng bản ghi thông thường
  4. Trong tiêu đề và bản ghi, có thể có một hoặc nhiều trường được phân tách bằng dấu phẩy
  5. Các trường chứa dấu ngắt dòng, dấu ngoặc kép và dấu phẩy phải được đặt trong dấu ngoặc kép
  6. Nếu dấu ngoặc kép được sử dụng để bao quanh các trường, thì dấu ngoặc kép xuất hiện bên trong trường phải được thoát bằng cách đặt trước nó bằng một dấu ngoặc kép khác

Các tệp CSV chứa các bản ghi có dấu phẩy hoặc ngắt dòng trong các chuỗi được trích dẫn không thuộc phạm vi của chúng tôi;

Bây giờ, hãy thiết lập tệp CSV mẫu tiêu chuẩn của chúng tôi

$ cat input.csv
SNo,Quantity,Price,Value
1,2,20,40
2,5,10,50

2. 1. Đọc bản ghi từ một tệp

Chúng tôi sẽ chạy một ví dụ để đọc các bản ghi từ tệp đầu vào của chúng tôi

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv

Ở đây, chúng tôi đã sử dụng lệnh đọc để đọc các bản ghi được phân tách bằng dấu ngắt dòng (\n) của tệp CSV của chúng tôi. Chúng tôi sẽ kiểm tra đầu ra từ tập lệnh của chúng tôi

Record is : SNo,Quantity,Price,Value
Record is : 1,2,20,40
Record is : 2,5,10,50

Như chúng ta có thể thấy, có một sự phức tạp; . Vì vậy, hãy đi sâu vào các giải pháp

2. 2. Bỏ qua dòng tiêu đề

Chúng tôi sẽ chạy một ví dụ khác để loại trừ dòng tiêu đề khỏi đầu ra

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < <(tail -n +2 input.csv)

Ở đây chúng tôi đã sử dụng lệnh tail để đọc từ dòng thứ hai của tệp. Sau đó, chúng tôi đã chuyển đầu ra dưới dạng tệp vào vòng lặp while bằng cách sử dụng quy trình thay thế. <(. ) cho phép chúng tôi chỉ định lệnh đuôi và cho phép Bash đọc từ đầu ra của nó dưới dạng tệp

Record is : 1,2,20,40
Record is : 2,5,10,50

Bây giờ chúng ta sẽ thử một cách khác để đạt được kết quả tương tự

#!/bin/bash
exec < input.csv
read header
while read line
do
   echo "Record is : $line"
done 

Trong cách tiếp cận này, chúng tôi đã sử dụng lệnh exec để thay đổi đầu vào tiêu chuẩn để đọc từ tệp. Sau đó, chúng tôi sử dụng lệnh đọc để xử lý dòng tiêu đề. Sau đó, chúng tôi đã xử lý tệp còn lại trong vòng lặp while

3. Phân tích giá trị từ tệp CSV

Cho đến nay, chúng tôi đã đọc các bản ghi được phân tách bằng ngắt dòng từ các tệp CSV. Từ giờ trở đi, chúng ta sẽ xem xét các phương pháp để đọc các giá trị từ mỗi bản ghi dữ liệu

3. 1. Từ tất cả các cột

Hãy xem cách lưu trữ các giá trị trường khi chúng tôi lặp qua tệp CSV

#! /bin/bash
while IFS="," read -r rec_column1 rec_column2 rec_column3 rec_column4
do
  echo "Displaying Record-$rec_column1"
  echo "Quantity: $rec_column2"
  echo "Price: $rec_column3"
  echo "Value: $rec_column4"
  echo ""
done < <(tail -n +2 input.csv)

Lưu ý rằng chúng ta đang đặt Dấu tách trường đầu vào (IFS) thành “,”  trong vòng lặp while. Do đó, chúng ta có thể phân tích các giá trị trường được phân tách bằng dấu phẩy thành các biến Bash bằng lệnh đọc

Chúng tôi cũng sẽ kiểm tra đầu ra được tạo khi thực thi tập lệnh trên

Displaying Record-1
Quantity: 2
Price: 20
Value: 40

Displaying Record-2
Quantity: 5
Price: 10
Value: 50

3. 2. Từ vài cột đầu tiên

Có thể có những trường hợp chúng tôi chỉ quan tâm đến việc đọc một vài cột đầu tiên của tệp để xử lý

Chúng tôi sẽ chứng minh điều này bằng một ví dụ

________số 8

Trong ví dụ này, chúng ta có thể lưu trữ giá trị trong trường thứ nhất và trường thứ hai của CSV đầu vào trong các biến rec_column1 và rec_column2 tương ứng. Đáng chú ý, chúng tôi đã lưu trữ các trường còn lại trong biến rec_remaining

Hãy nhìn vào đầu ra của kịch bản của chúng tôi

Displaying Record-1
Quantity: 2
Remaining fields of Record-1 : 20,40

Displaying Record-2
Quantity: 5
Remaining fields of Record-2 : 10,50

3. 3. Từ số cột cụ thể

Một lần nữa, chúng tôi sẽ sử dụng quy trình thay thế để chỉ chuyển các cột cụ thể vào vòng lặp while để đọc. Để tìm nạp các cột đó, chúng tôi sẽ sử dụng lệnh cắt

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
0

Do đó, chúng tôi chỉ có thể phân tích cú pháp cột đầu tiên và cột thứ ba của CSV đầu vào của mình

Chúng tôi sẽ xác thực nó với đầu ra

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
1

3. 4. Từ tên cột cụ thể

Có thể có những tình huống mà chúng tôi có thể cần phân tích cú pháp các giá trị từ CSV dựa trên tên cột trong dòng tiêu đề

Chúng tôi sẽ minh họa điều này bằng một tập lệnh đơn giản do người dùng điều khiển

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
2

Tập lệnh này lấy col_b làm đầu vào từ người dùng và in giá trị cột tương ứng cho mọi bản ghi trong tệp

Chúng tôi đã tính toán vị trí của một cột bằng cách sử dụng kết hợp các lệnh tr, awk, grep và nl

Đầu tiên, chúng tôi đã chuyển đổi dấu phẩy trong dòng tiêu đề thành ngắt dòng bằng lệnh tr. Sau đó, chúng tôi nối thêm số dòng ở đầu mỗi dòng bằng lệnh nl. Tiếp theo, chúng tôi đã tìm kiếm tên cột trong đầu ra bằng lệnh grep và cắt bớt các khoảng trắng trước đó bằng lệnh tr

Cuối cùng, chúng tôi đã sử dụng lệnh awk để lấy trường đầu tiên, tương ứng với số cột

Chúng tôi sẽ lưu tập lệnh trên dưới dạng parse_csv. sh để thực hiện

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
3

Theo dự kiến, khi "Giá" được cung cấp làm đầu vào, chỉ các giá trị của số cột tương ứng với chuỗi "Giá" trong tiêu đề được in. Cách tiếp cận này có thể đặc biệt hữu ích khi trình tự các cột trong tệp CSV không được đảm bảo

4. Ánh xạ các cột của tệp CSV vào mảng Bash

Trong phần trước, chúng tôi đã phân tích các giá trị trường thành các biến Bash cho mỗi bản ghi. Bây giờ chúng ta sẽ kiểm tra các phương thức để phân tích toàn bộ cột CSV thành mảng Bash

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
4

Chúng tôi đang sử dụng lệnh thay thế để loại trừ dòng tiêu đề bằng lệnh tail, sau đó sử dụng lệnh cắt để lọc các cột tương ứng. Đáng chú ý, bộ dấu ngoặc đơn đầu tiên được yêu cầu để giữ đầu ra của lệnh thay thế trong biến arr_record1 dưới dạng một mảng

Hãy kiểm tra đầu ra tập lệnh

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
5

5. Phân tích cú pháp tệp CSV thành một mảng Bash

Có thể có trường hợp chúng tôi muốn ánh xạ toàn bộ tệp CSV thành một mảng. Sau đó chúng ta có thể sử dụng mảng để xử lý các bản ghi

Hãy kiểm tra việc thực hiện

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
6

Trong ví dụ này, chúng tôi đọc dòng từ CSV đầu vào của mình, sau đó nối nó vào mảng arr_csv (+= được sử dụng để nối các bản ghi vào mảng Bash). Sau đó, chúng tôi đã in các bản ghi của mảng bằng vòng lặp for

Hãy kiểm tra đầu ra

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
7

Đối với Bash phiên bản 4 trở lên, chúng ta cũng có thể điền vào mảng bằng lệnh readarray

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
8

Điều này đọc các dòng từ đầu vào. csv thành một biến mảng, array_csv. Tùy chọn -t sẽ xóa các dòng mới ở cuối mỗi dòng

6. Phân tích tệp CSV có ngắt dòng và dấu phẩy trong bản ghi

Cho đến nay, chúng tôi đã sử dụng đầu vào tệp. csv để chạy tất cả các hình minh họa của chúng tôi

Bây giờ, chúng tôi sẽ tạo một tệp CSV khác có chứa ngắt dòng và dấu phẩy trong các chuỗi được trích dẫn

#!/bin/bash
while read line
do
   echo "Record is : $line"
done < input.csv
9

Có thể có thêm một số hoán vị và tổ hợp ngắt dòng, dấu phẩy và dấu ngoặc kép trong tệp CSV. Vì lý do này, việc xử lý các tệp CSV như vậy chỉ với các tiện ích tích hợp Bash là một nhiệm vụ phức tạp. Nói chung, các công cụ của bên thứ ba, như csvkit, được sử dụng để phân tích cú pháp CSV nâng cao

Tuy nhiên, một giải pháp thay thế phù hợp khác là mô-đun CSV của Python, vì Python thường được cài đặt sẵn trên hầu hết các bản phân phối Linux

7. Phần kết luận

Trong bài viết này, chúng tôi đã nghiên cứu nhiều kỹ thuật để phân tích các giá trị từ tệp CSV

Đầu tiên, chúng ta đã thảo luận về tiêu chuẩn CSV và kiểm tra các bước để đọc bản ghi từ một tệp. Tiếp theo, chúng tôi đã triển khai một số nghiên cứu điển hình để phân tích cú pháp các giá trị trường của tệp CSV. Chúng tôi cũng đã khám phá các cách xử lý dòng tiêu đề tùy chọn của tệp CSV

Sau đó, chúng tôi đã trình bày các kỹ thuật để lưu trữ các cột hoặc tất cả các bản ghi của tệp CSV vào các mảng Bash. Cuối cùng, chúng tôi đã giới thiệu ngắn gọn về một số công cụ của bên thứ ba để phân tích cú pháp CSV nâng cao

tác giả dưới cùng

Nếu bạn có một vài năm kinh nghiệm trong hệ sinh thái Linux và bạn muốn chia sẻ trải nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi