Самый легкий способ открыть текстовый файл и считать его в массив с Perl

Поскольку вы используете файлы .csv, вы можете сказать PHP, что ваш разделитель - точка с запятой.

<?php 

while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) 

?>

Для поиска каждого значения вашего файла вы можете использовать следующую стратегию:

[ 1111]
<?php

$row = 0;
if (($handle = fopen("c:\\temp\\test.csv", "r")) !== FALSE)
{
    //Searching line by line of the file
    while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
    {
        $num = count($data);
        $row++;
		
        //Searching column by column of the current line
        for ($col = 0; $col < $num; $col++)
        {
			//Here you can use the desired values
			switch ($col) {
				case 0:
					$student_id = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 1:
					$student_login = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 2:
					$student_password = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 3:
					$student_first_name = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 4:
					$student_last_name = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 5:
					$student_phone_number = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 6:
					$student_gender = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 7:
					$original_back_school = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 8:
					$original_end_time = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 9:
					$original_class = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 10:
					$class_Halom = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 11:
					$parent_id = mysqli_real_escape_string($connect,$data[$col]);
					break;
				case 12:
					$teacher_id = mysqli_real_escape_string($connect,$data[$col]);
					break;
			}//end switch
			
        }//endfor (columns of each line)
		
		//If your file has a header and you wish to skip it, you can do something like this:
		//if ($row > 1) { //create your query and execute it... }
		
		
			$query = "INSERT INTO `student`(`student_id`, `student_login`, `student_password`, `student_first_name`, `student_last_name`, `student_phone_number`, `student_gender`, `original_back_school`, `original_end_time`, `original_class`, `class_Halom`, `parent_id`,`teacher_id`) VALUES ";
			$query.=                      "($student_id, '$student_login','$student_password','$student_first_name','$student_last_name','$student_phone_number','$student_gender','$original_back_school','$original_end_time','$original_class','$class_Halom', $parent_id, $teacher_id) ";
			mysqli_query($connect, $query);		
		//}
		
    }
    fclose($handle);
}

?>

20
задан Brian 17 April 2009 в 19:10
поделиться

8 ответов

У вас есть несколько вариантов классический метод do:

my @array = do {
    open my $fh, "<", $filename
        or die "could not open $filename: $!";
    <$fh>;
};

метод IO :: All :

use IO::All;

my @array = io($filename)->slurp;

метод File :: Slurp :

use File::Slurp;

my @array = read_file($filename);

И, вероятно, еще много, в конце концов TIMTOWTDI .

27
ответ дан 29 November 2019 в 22:36
поделиться

that is the famous "slurp mode":

  my @lines = <FILEHANDLE> ;

you may also see Perl Slurp Ease

15
ответ дан 29 November 2019 в 22:36
поделиться

I think this is what you are looking for

File::Slurp

15
ответ дан 29 November 2019 в 22:36
поделиться

Also have a look at Perl6::Slurp which implements the Perl6 version of slurp and is recommended in the "Perl Best Practices" book.

Some examples....

my @lines         = slurp 'filename';
my @lines_chomped = slurp 'filename', { chomp => 1 };
my @lines_utf8    = slurp 'filename', { utf8  => 1 };
6
ответ дан 29 November 2019 в 22:36
поделиться

You've gotten the general techniques, but I want to put in that Perl sort of discourages you from doing that because it's very often the case that you can do the same thing you're doing one-line-at-a-time, which is inherently far more efficient.

4
ответ дан 29 November 2019 в 22:36
поделиться

Вы также можете рассмотреть возможность использования Tie :: File, особенно если вы читаете большие файлы и не хотите прочитать весь файл в память. Это основной модуль. Также, пожалуйста, обратитесь к perlfaq5 .

6
ответ дан 29 November 2019 в 22:36
поделиться

Для быстрого и грязного, мне скорее нравится простота гадости с @ARGV .

# Ysth is right, it doesn't automatically die; I need another line.
use 5.010;
use strict;
my @rows = do { 
    use warnings FATAL => 'inplace'; # oddly enough, this is the one. ??
    @ARGV='/a/file/somewhere';
    <>;
};
say q(Not gettin' here.);

Если Perl * не может открыть файл, он автоматически умирает.


* - исполняемый файл, поэтому, пожалуйста, не пишите с большой буквы.

2
ответ дан 29 November 2019 в 22:36
поделиться

Я бы порекомендовал объектно-ориентированный подход, который не требует модулей вне дистрибутива CORE и будет работать где угодно:

use strict;
use warnings;
use IO::File;
my $fh = IO::File->new("< $file");

foreach ($fh->getlines) {
    do_something($_);
}
$fh->close
1
ответ дан 29 November 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: