2010-08-18 44 views

Trả lời

0

Hãy thử thay thế tất cả các tab bằng dấu phẩy.

Có thể có một regex như s/\t/,/g, nếu bạn không có bất kỳ trường được trích dẫn nào.

Hoặc, bạn biết đấy, Excel có thể làm điều đó cho ya. Hoặc R. Hoặc bất kỳ thứ gì có thể lấy trong tệp TSV.

-2

Trong unix:

sed -i -e 's/\t/,/g' filename 
23

Bạn có thể sử dụng sed như:

sed 's/\t/,/g' input_file > output_file 

Điều này sẽ giữ cho các tập tin đầu vào không thay đổi và sẽ tạo ra một tập tin mới output_file với những thay đổi.

Nếu bạn muốn thay đổi các tập tin đầu vào riêng của mình mà không cần tạo một tập tin mới, bạn có thể sử dụng -i tùy chọn để sed để làm thay đổi inplace:

sed -i 's/\t/,/g' input_file 
+3

Điều này không n't làm việc trong OS X, nó có vẻ phù hợp với chữ "t" và không phải là một tab. – Mike

+0

Thay vì gõ \ t trên OSX, nhấn ctrl + v và sau đó nhấn tab – TheAppchemist

+0

@codaddict, Nếu tôi có thể hỏi, 'g' trong' \ s/\ t /, g'' là gì? – Les

0

Đây có phải là dễ câu hỏi-bài-ngôn ngữ thông thường điều? Ok, đây là giải pháp haskell của tôi:

main = interact (unlines . replTab . lines) where 
    replTab l = l  >>= (\line -> 
    "\"" ++ line "\"" >>= \char -> 
    case char of 
     '\t' -> "\",\"" 
     '"' -> "\"\"" 
     _ -> [char] 
    ) 

chưa được kiểm tra, nhưng phải hoạt động.

PS: Tất cả các giải pháp khác không biết về dấu phẩy thoát.

2

này cũng có thể đạt được với Perl:

Để ống kết quả vào một tập tin đầu ra mới, bạn có thể sử dụng như sau:
perl -wnlp -e 's/\t/,/g;' input_file.txt > output_file.csv

Nếu bạn muốn chỉnh sửa các tập tin trong nơi, bạn có thể gọi tùy chọn -i:
perl -wnlpi -e 's/\t/,/g;' input_file.txt

Nếu bởi một số cơ hội bạn thấy rằng những gì bạn đang đối phó với không phải là thực sự tab, nhưng thay vào đó nhiều không gian, bạn có thể sử dụng sau đây để thay thế mỗi occurren ce của hai hay nhiều không gian với một dấu phẩy:
perl -wnlpi -e 's/\s+/,/g;' input_file

Hãy ghi nhớ rằng \s đại diện cho bất kỳ ký tự khoảng trắng, trong đó có khoảng trắng, tab hoặc dòng mới và không thể được sử dụng trong chuỗi thay thế.

28

Câu trả lời cho OSX là khác nhau.

MacOS không hiểu \t trong biểu thức sed.

Bạn phải chèn tab đen vào mô hình tìm kiếm sed bằng cách sử dụng ctrl + v sau đó tab (xem How can I insert a tab character with sed on OS X?)

sed 's/ /,/g' input_file > output_file 
+2

Trên OSX, bạn có thể sử dụng GNU sed để hiểu '\ t'. [Câu hỏi này] (http://stackoverflow.com/questions/30003570/how-to-use-gnu-sed-on-mac-os-x) là về cách cài đặt nó. – janosdivenyi

3

Gấu nhớ rằng có rất nhiều hương vị của dấu phẩy -giá trị có giá trị. Vì bạn không chỉ định một, tôi sẽ giả sử định dạng RFC-4180, trong mã hóa UTF-8 và TSV giống nhau nhưng sử dụng các tab thay vì dấu phẩy.

Cách tiếp cận ngây thơ sẽ chỉ đơn giản là thay thế tất cả các tab với một dấu phẩy:

tr '\t' , 

này rơi xuống nếu bất kỳ giá trị đã chứa một dấu phẩy, hoặc nếu có chứa một tab trích dẫn. Bạn cần tối thiểu phân tích cú pháp tệp, để duy trì trích dẫn. Thay vì tay lăn một phân tích cú pháp như vậy, nó đơn giản hơn, rõ ràng hơn và linh hoạt hơn để sử dụng một đã viết, chẳng hạn như Text::CSV cho Perl:

#!/usr/bin/perl -w 

use Text::CSV; 

my $tsv = Text::CSV->new({ sep_char => "\t", auto_diag => 2 }); 
my $csv = Text::CSV->new(); 

while (my $row = $tsv->getline(*ARGV)) { 
    $csv->print(STDOUT, $row) or die $csv->error_diag(); 
    print $/; 
} 
$csv->error_diag() unless $tsv->eof; 
0

sed -e 's/TAB_CHAR /,/g' data.tsv > data.csv

phần khó là làm thế nào để nhập ký tự TAB trong dòng lệnh, để làm điều đó: Chỉ hist "CTRL + V", sau đó TAB

tôi thường xuyên sử dụng điều này với các truy vấn mysql với - tham số e như được mô tả trong bài đăng trên blog này http://blog.modsaid.com/2013/12/exporting-data-from-remote-mysql.html

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