Tôi có một tập tin dữ liệu, với mỗi dòng có một số, nhưCách đúng để đọc một tập tin dữ liệu vào một mảng
10
20
30
40
Làm thế nào để đọc tập tin này và lưu trữ dữ liệu vào một mảng?
Để tôi có thể thực hiện một số thao tác trên mảng này.
Tôi có một tập tin dữ liệu, với mỗi dòng có một số, nhưCách đúng để đọc một tập tin dữ liệu vào một mảng
10
20
30
40
Làm thế nào để đọc tập tin này và lưu trữ dữ liệu vào một mảng?
Để tôi có thể thực hiện một số thao tác trên mảng này.
Chỉ cần đọc các tập tin vào một mảng, một dòng cho mỗi phần tử, là tầm thường:
open my $handle, '<', $path_to_file;
chomp(my @lines = <$handle>);
close $handle;
Bây giờ các dòng của fi le nằm trong mảng @lines
.
Tie::File
là những gì bạn cần:
Tóm tắt
# This file documents Tie::File version 0.98 use Tie::File; tie @array, 'Tie::File', 'filename' or die ...; $array[13] = 'blah'; # line 13 of the file is now 'blah' print $array[42]; # display line 42 of the file $n_recs = @array; # how many records are in the file? $#array -= 2; # chop two records off the end for (@array) { s/PERL/Perl/g; # Replace PERL with Perl everywhere in the file } # These are just like regular push, pop, unshift, shift, and splice # Except that they modify the file in the way you would expect push @array, new recs...; my $r1 = pop @array; unshift @array, new recs...; my $r2 = shift @array; @old_recs = splice @array, 3, 7, new recs...; untie @array; # all finished
IMHO 'Tie :: Tệp' là quá mức cần thiết cho một tác vụ đơn giản là đọc tệp và đặt nội dung trong một mảng. – dgw
[Tie :: File] (http://p3rl.org/Tie::File) là quá mức cần thiết trừ khi tệp của bạn rất lớn. –
Có là phương pháp đơn giản nhất, sử dụng mô-đun File::Slurp
:
use File::Slurp;
my @lines = read_file("filename", chomp => 1); # will chomp() each line
Nếu bạn cần một số xác nhận cho mỗi dòng bạn có thể sử dụng grep
trước read_file
.
Ví dụ, đường bộ lọc chỉ chứa số nguyên:
my @lines = grep { /^\d+$/ } read_file("filename", chomp => 1);
Không thực sự. Bạn quên ** chomp **. Có lẽ điều này sẽ hoạt động tốt hơn: my @data = map {chomp $ _; $ _} read_file ("tên tệp"); –
Lúc đầu, tôi đã không chú ý, mỗi dòng của một tập tin chứa một số. Vì vậy, sẽ tốt hơn nếu đặt regex cho các số thành 'map' thay vì' chomp'. Đã cập nhật. – Taras
Đầu tiên. Nếu ai đó thực sự cần chomp() thì hãy sử dụng tùy chọn read_file ("tên tệp", chomp => 1) thay vì bản đồ. Thứ hai. Tôi không nghĩ rằng ai đó thực sự cần xác thực. Câu hỏi không phải là cách đọc số từ một tập tin. Thứ ba. Bạn không kiểm tra các con số như 3.1415. Forth. Bạn có thể muốn sử dụng grep {/^\ d + /} thay vì bản đồ. –
Tôi thích ...
@data = `cat /var/tmp/somefile`;
Nó không phải là quyến rũ như những người khác, nhưng, nó hoạt động như nhau. Và ...
$todays_data = '/var/tmp/somefile' ;
open INFILE, "$todays_data" ;
@data = <INFILE> ;
close INFILE ;
Chúc mừng.
Bạn thực sự phải xử lý trường hợp cho lỗi 'mở', bằng cách kiểm tra giá trị trả lại hoặc sử dụng tự động sửa. Để được đúng chính xác, bạn cũng nên làm tương tự cho 'đóng'. – zgpmax