2012-09-02 35 views
6

Tôi đang đọc tệp dữ liệu ở định dạng văn bản bằng cách sử dụng readLines. Cột 'đầu tiên' đầu tiên là văn bản phức tạp mà tôi không cần. Các cột tiếp theo chứa dữ liệu mà tôi cần. Cột 'đầu tiên' đầu tiên và dữ liệu được phân tách bằng dấu hai chấm (:). Tôi muốn chia từng hàng tại dấu hai chấm đầu tiên và xóa chuỗi văn bản kết quả, chỉ giữ lại dữ liệu.Tách chuỗi tại dấu hai chấm đầu tiên

Dưới đây là tệp dữ liệu ví dụ. Một biến chứng tiềm năng là một dòng dữ liệu chứa nhiều dấu hai chấm. Dòng đó có thể tại một số điểm trở thành tiêu đề của tôi. Vì vậy, tôi có lẽ không nên phân chia ở mọi đại tràng, ngay tại đại tràng đầu tiên.

my.data <- "first string of text..: aa : bb : cc 
      next string ........ : 2 0 2 
      third string......1990: 7 6 5 
      last string   : 4 2 3" 

my.data2 <- readLines(textConnection(my.data)) 
my.data2 

Tôi đã thử mã trình bày ở đây:

Split on first comma in string

và ở đây:

R: removing the last three dots from a string

Mã tại liên kết đầu tiên trên dường như tách chỉ ở ruột kết đầu tiên của Dòng đầu tiên. Mã số ở liên kết thứ hai có thể sẽ làm những gì tôi muốn, nhưng quá phức tạp để tôi sửa đổi nó thành công cho đến nay.

Sau đây là các dữ liệu tôi hy vọng để có được, lúc này tôi chỉ có thể thay thế các dấu hai chấm còn lại trong hàng đầu tiên với khoảng trống bằng một gsub tuyên bố rất đơn giản:

aa : bb : cc 
    2 0 2 
    7 6 5 
    4 2 3 

Xin lỗi nếu điều này là một bản sao của một bài đăng mà tôi chưa xác định và cảm ơn bạn vì bất kỳ lời khuyên hoặc trợ giúp nào.

Trả lời

15

Sau đây sẽ bắt đầu vào đầu của chuỗi và sau đó lấy tất cả mọi thứ lên đến và bao gồm cả ruột đầu tiên và bất kỳ dấu cách bổ sung và thay thế mà không có gì (về cơ bản chỉ cần loại bỏ nó)

gsub("^[^:]+:\\s*", "", my.data2) 

Nếu bạn don 't muốn loại bỏ các không gian bạn có thể làm

gsub("^[^:]+:", "", my.data2) 

Đối với một số làm rõ về những gì các biểu thức chính quy ban đầu đang làm.Bắt đầu từ đầu:

^ này nói chỉ thấy trận đấu vào lúc bắt đầu của chuỗi

[^:] này đại diện cho bất kỳ nhân vật đó không phải là một dấu hai chấm

+ này nói để phù hợp với nhân vật trước một hoặc nhiều lần (để phù hợp với nhiều ký tự không phải ruột càng tốt)

: đây là những gì thực sự phù hợp với ruột

\\s này phù hợp với một không gian

* này nói để phù hợp với nhân vật trước không hay nhiều lần (vì vậy chúng tôi loại bỏ bất kỳ không gian bổ sung sau dấu hai chấm)

Vì vậy, đặt nó tất cả cùng nhau chúng ta bắt đầu vào đầu của chuỗi sau đó khớp với nhiều ký tự không dấu hai chấm nhất có thể, sau đó lấy ký tự đại tràng đầu tiên và bất kỳ dấu cách bổ sung nào và thay thế tất cả những thứ đó bằng không (về cơ bản là loại bỏ tất cả rác mà chúng tôi không muốn).

+0

Cảm ơn bạn đã trả lời và giải thích nổi bật. –

+5

+1 để giải thích –

Các vấn đề liên quan