2010-10-14 14 views
60

Tôi đang viết một gói R trong đó mã R nói chuyện với một ứng dụng Java. Ứng dụng Java đưa ra một chuỗi định dạng CSV và tôi muốn mã R có thể đọc trực tiếp chuỗi và chuyển đổi nó thành một tệp dữ liệu.Có cách nào để sử dụng read.csv để đọc từ một chuỗi giá trị chứ không phải là tệp trong R?

+0

bạn có thể sử dụng gói rJava để thay thế? –

+0

Có lẽ bạn có thể fiddle xung quanh với allowEscapes (trong read.table). Chỉ cần đảm bảo đầu ra java sử dụng \ n để ngắt dòng. –

+0

@Joshua Tôi đang sử dụng rJava để nói chuyện với chương trình Java của tôi. Tôi nghĩ sẽ hiệu quả hơn khi chuyển đổi các đối tượng java nặng của tôi thành chuỗi trước khi chuyển nó vào R. –

Trả lời

82

Vâng, nhìn vào sự giúp đỡ cho textConnection() - các rất mạnh mẽ khái niệm trong R là về cơ bản tất cả các độc giả (như ví dụ read.table() và các biến thể của nó) truy cập vào các kết nối đối tượng có thể là một tập tin, hoặc từ xa URL hoặc một đường ống đến từ một ứng dụng khác hoặc ... một số văn bản như trong trường hợp của bạn.

Bí quyết tương tự được sử dụng cho cái gọi là ở đây các tài liệu:

> lines <- " 
+ flim,flam 
+ 1.2,2.2 
+ 77.1,3.14 
+ " 
> con <- textConnection(lines) 
> data <- read.csv(con) 
> close(con) 
> data 
    flim flam 
1 1.2 2.20 
2 77.1 3.14 
> 

Lưu ý rằng đây là một đơn giản cách để xây dựng một cái gì đó nhưng nó cũng là tốn kém do sự phân tích cú pháp lặp đi lặp lại của tất cả các dữ liệu. Có nhiều cách khác để chuyển từ Java sang R, nhưng điều này sẽ giúp bạn đi nhanh chóng. Hiệu quả đến tiếp theo ...

Sửa đổi một câu trả lời cũ 7 năm: Bởi bây giờ, đây là nhiều nhờ đơn giản để lập luận text= mà đã được thêm vào read.csv() và giống nhau:

R> data <- read.csv(text="flim,flam 
+ 1.2,2.2 
+ 77.1,3.14") 
R> data 
    flim flam 
1 1.2 2.20 
2 77.1 3.14 
R> 
+8

Các phiên bản R gần đây có một cơ chế đơn giản hơn, hãy xem câu trả lời của @Adam Bradley trong chủ đề này: http://stackoverflow.com/a/16349171/17523 –

4

Vâng. Ví dụ:

string <- "this,will,be\na,data,frame" 
x <- read.csv(con <- textConnection(string), header=FALSE) 
close(con) 
#> x 
# V1 V2 V3 
#1 this will be 
#2 a data frame 
1

Giả sử bạn có một tập tin gọi tommy.csv (có, giàu trí tưởng tượng, tôi biết ...) có các nội dung của

col1 col2 \ n 1 1 \ n 2 2 \ n 3 3

trong đó mỗi dòng được phân tách bằng ký tự thoát "\ n".

Tệp này có thể được đọc với sự trợ giúp của đối số allowEscapes trong read.table.

> read.table("tommy.csv", header = TRUE, allowEscapes = TRUE) 

    col1 col2 
1 col1 col2 
2 1 1 
3 2 2 
4 3 3 

Không hoàn hảo (sửa đổi tên cột ...), nhưng đó là khởi đầu.

0

Chức năng này kết thúc câu trả lời của Dirk thành một biểu mẫu thuận tiện. Thật tuyệt vời khi trả lời các câu hỏi về SO, nơi người hỏi vừa mới đổ dữ liệu trên màn hình.

text_to_table <- function(text, ...) 
{ 
    dfr <- read.table(tc <- textConnection(text), ...) 
    close(tc) 
    dfr 
} 

Để sử dụng, trước tiên hãy sao chép dữ liệu trên màn hình và dán vào trình chỉnh sửa văn bản của bạn.

foo bar baz
1 2 một
3 4 b

Bây giờ quấn nó với text_to_table, dấu ngoặc kép và bất kỳ đối số khác cho read.table.

text_to_table("foo bar baz 
1 2 a 
3 4 b", header = TRUE) 
70

Lưu ý rằng trong các phiên bản bây giờ hiện hành của R, bạn không còn cần textConnection(), nó có thể chỉ đơn giản là làm điều này:

> states.str='"State","Abbreviation" 
+ "Alabama","AL" 
+ "Alaska","AK" 
+ "Arizona","AZ" 
+ "Arkansas","AR" 
+ "California","CA"' 
> read.csv(text=states.str) 
     State Abbreviation 
1 Alabama   AL 
2  Alaska   AK 
3 Arizona   AZ 
4 Arkansas   AR 
5 California   CA 
+5

Tôi biết chính điều này hơi muộn nhưng - có lẽ có thể hữu ích để gửi điều này như là một chỉnh sửa cho câu trả lời được chấp nhận, vì nó không chắc OP bây giờ sẽ thay đổi câu trả lời chấp nhận, nhưng điều này bây giờ có vẻ là câu trả lời tốt hơn? – obfuscation

+1

IMHO, OP sẽ không chấp nhận câu trả lời được chấp nhận và chấp nhận câu trả lời này ... – Mischa

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