일. 서언
원래 이 글을 쓰려고 하지 않았는데 인터넷에서 몇 개의 demo를 복사하는 것은 다소 문제가 있습니다. 어떤 것은 AA, BB로 시작하는 것을 읽을 수 없고 어떤 것은 데이터를 읽을 수 없기 때문에, 어떤 것은 수정하고 모두에게 공유합니다. 이 demo는 저의 7000여 행, 110여 열의 데이터를 모두 읽고 수열로 쓸 수 있습니다
아래는 엑셀의 캡처본으로 비교적 큰 파일인지 알 수 있습니다
2. demo 읽기 및 비교
1, php 읽기 exceldemo
/**
* @param $file
* @param array $params
* @return array
* @throws PHPExcel_Exception
* @throws PHPExcel_Reader_Exception
* @params:모든 엑셀 데이터를 얻고, 이미 표제어를 붙여서 완전히 획득하였다
* @author:ljf
* @date:2019/12/6
* @time:18:14
*/
function getData($file,$params = array())
{
$path = __DIR__.'/vendor/PHPExcel_1.8.0/PHPExcel.php';
require_once($path);
//파일 형식 가져오기
$file_suffix = pathinfo($file)['extension'];
//다른 엑셀 버전에 따라 템플릿 설정
$excel_temple = array('xls'=>'Excel5','xlsx'=>'Excel2007');
$excelReader = \PHPExcel_IOFactory::createReader($excel_temple[$file_suffix]);//Office 버전이 다운사이징이 되므로 2003 버전으로 설정
$sheet = $excelReader->load($file)->getSheet(2); //sheet1조작하다
$excelCont = array(
'highestCol' => $sheet->getHighestColumn(), //나열하다
'highestRow' => $sheet->getHighestRow(), //행
'highestColumnIndex' => PHPExcel_Cell::columnIndexFromString($sheet->getHighestColumn()) // 몇 줄
);
$countCol = isset($params['count_col']) ? $params['count_col'] : $excelCont['highestColumnIndex'];//유효한 열 수, 읽기 전에 $countCol 열만 가져옵니다
$startRow = isset($params['need_head']) && $params['need_head'] ? 1 : 2;//첫 줄부터 읽고 표제어를 읽다
$rightArr = array();
//몇 줄 가져오기
$row = $excelCont['highestRow'];
$emptyLine = 0;
for ($j = $startRow; $j < intval($row) + 1; $j++) {
$retArr = array();//행의 셀에 대한 데이터
$emptyCol = 0;
for($i = 0; $i < $countCol;$i++){//줄 셀 순환
$val = $sheet->getCellByColumnAndRow($i, 1)->getValue();//첫 번째 줄에 표가 있다고 가정할 때, 첫 번째 줄의 모든 열의 정보만 가져옵니다
//가져온 헤더의 내용을 바탕으로 새 배열에 저장
$retArr[$val] = $sheet->getCellByColumnAndRow($i, $j)->getValue(); //좌표에 따라 내용 가져오기
$retArr[$val] = isset($retArr[$val]) ? trim($retArr[$val]) : $retArr[$val];
if($retArr[$val] === null){
$emptyCol++;
}
}
if($emptyCol == $countCol){//这行为空行,아무 배열도 넣지 않음
$emptyLine++;
}else {
$rightArr[] = $retArr;
}
}
unset($sheet);
if(empty($rightArr)){
$result = array(
'errcode' =>1004,
'errmsg' =>"업로드 파일에 올바른 데이터가 없습니다",
);
}else{
$result = array(
'errcode' =>0,
'errmsg' =>"",
'data' =>$rightArr,
);
}
return $result;
}
// 호출 방법
$start = time();
$start1 = memory_get_usage();
$file = "./devices.xlsx";
//$result = _get_excel_metainfo($file);
$result = getData($file);
$end1 = memory_get_usage(true); //10k elements array;
$end = time();
var_dump(convert($end1)); //메모리 사용량 가져오기
var_dump($end - $start);
이상은 읽기 부분의 코드를 읽는 것이고, 구체적인 논리는 주석을 보면 됩니다. phpexcel 클래스를 도입하고, 그 클래스를 통해서 파일을 열어 열 길이, 행 길이를 얻어 배열에 순환적으로 값을 매긴다는 것입니다.
테스트하는 동안 속도가 약간 느려서 시간이 걸리고 메모리가 많이 소요됩니다
php 시간 소모 및 메모리 사용:
string(6) "178 mb" int(13)
13s가 걸리고 메모리 소모도 만만치 않다.그동안 phpexcel이 성능이 좋지 않다는 이야기를 들어왔고, 이번에 철저히 알게 된 셈인데, 13s의 판독시간은 프로그램 안에서는 받아들일 수 없고, 굳이 php로 읽어야 한다면 비동기식으로 읽으라는 조언이다. 적어도 진행을 막지 않는 것이 좋다.
비동기 폴링 참고 가능 : php 비동기 폴링 구현
2,파이썬 이 엑셀 파일을 읽어라
블로거가 php를 테스트한 후 속도가 좀 느리다고 느껴 다시 파이썬의 판다스로 읽어보고 속도를 테스트해보니 대체 코드를 읽어보면 대략 다음과 같다
pandas.DataFrame(pandas.read_excel('excel파일 경로'))
시간이 아래와 같다:
cost mem: 2850 3M 정도의 메모리 사용
cost time: 2.47637677192688
모르는 것보다도, 깜짝 놀랐습니다, 파이썬은 2.5s밖에 걸리지 않습니다, 메모리 사용량은 매우 적습니다, 이것은...
메모리 방면에서는 php가 제때에 일부 변수를 방출하지 못하기 때문에 배열에 값을 매겨 메모리 비교를 할 수 있다크고, 파이썬은 동작이 적기 때문에 메모리 비교가 정확하지 않지만, 파이썬이 더 적은 메모리를 쓰는 것도 사실이다.phpexcel은 매운 치킨이다.
3. php 호출 python 코드
php가 python 코드를 어떻게 사용하는지에 대해 많은 블로거들이 쓴 것이 있습니다. 블로거들은 여기서 많이 쓰지 않습니다. 크게집에 관심이 있으면 바이두에 가면 된다는 글이 많다.
주의:
여기서 python을 호출하는 방법은 exec() 또는 system()입니다. 이 두 함수는 실제로 매우 위험합니다. 어떤 엄격한 환경에서는 두 함수를 모두 비활성화합니다.여러분은 사용 전에 php.ini를 열고 disable_functions를 조회하여 비활성화된 함수 안에 두 함수가 있는지 확인할 수 있습니다.이 두 함수를 모두 써야 할지 고민해야 하는 것은 위험하기 때문이다.
3. 총결산
언제부터인가 블로거들이 한 가지 대안을 선택할 때, 예를 들어 여기의 php와 파이썬이 엑셀을 읽는 것과 같은 다른 대안들을 비교하게 될지 모르지만, 그 대비는 어떤 언어의 좋고 나쁨을 비교하기보다는 안정감 있게 우열을 가리는 것이다.가끔 그런 비교언어가 귀찮아. 걸핏하면 xxx언어가 쓰레기라고 생각해. 나는 이런 비교언어가 수준도 그 정도라고 생각해. 프로그래밍언어는 도구일 뿐이지 네가 억지로 외우는 게 아니라고 생각해.경치.
자도 길지만 치도 짧다.얼마 전 친구들과 의논할 때 php의 장점은 민첩한 개발, 웹 개발이라고 했는데, php가 잘하는 것은 php가 못하는 부분과 다른 언어를 잘하는 부분을 굳이 비교한다면 실망할 수밖에 없다.말하자면, 현재의 프로그래밍 언어는 매우 다양합니다. 어떤 의미에서는 여전히 각 언어의 방점이 다르기 때문입니다. 만약 정말로 어떤 언어든지 모든 면에서 우수하다면, 아마도 일찌감치 강호를 통일했을 것입니다 하하.
파이팅!
'개발 꿀팁 > PHP' 카테고리의 다른 글
php코드 최적화 및 개발의 팁 (0) | 2022.07.21 |
---|---|
2021중대공장 php+go 면접 질문(1) (0) | 2022.07.21 |
PHP의 CI 프레임워크 학습 (0) | 2022.07.21 |
php 프로그램 메모리 최적화 배열 동작 최적화 (0) | 2022.07.20 |
php 대배열 순환 중첩의 성능 최적화 (0) | 2022.07.20 |