저는 Text :: CSV를 사용하여 CSV 파일을 읽고 필드를 구문 분석 한 다음 DBI를 통해 SQL Server에 레코드를 씁니다. 모든 필드는 조작해야하는 날짜 필드를 제외하면 황금색입니다.Perl - DBI 문자열이 잘못 큰 따옴표로 묶입니다.
CSV의 날짜 필드 형식은 'Fri Dec 20 14:56:54 2013'과 같습니다. 물론 SQLServer는 그 형식을 좋아하지 않습니다. 인체 공학적,이 블록을 사용하고 스크립트에서 다음 CSV에서 필드는 단어 '없음'을 포함하는 경우
가if ($i == 12 || $i == 13 || $i == 22 || $i == 23 || $i == 24 || $i == 25)
{
if (defined $fields[$i])
{
$dummy = UnixDate($fields[$i],'%m/%d/%Y %H:%M:%S');
$fields[$i] = $dummy;
}
}
(정의 된 검사, 그럼 내가 그래서 그 요소 상 미확정하고 있어요 때문에를 DB를 삽입 할 때 필드는 NULL이 될 것이다이 샘플 열에서, 요소 (24)를 제외한 컬럼/모든 필드 및 25 '없음'없음)
DBI 추적 켜기 날 보여준다..
<- bind_param(19, '1')= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(20, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(21, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(22, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(23, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(24, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(25, "12/20/2013 14:56:54")= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(26, "12/20/2013 14:55:37")= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(27, 'Unknown')= (1) [1 items] at upload_merged_host.pl line 71
CSV의 다른 필드/열이 올바르게 바인딩되어 있음을 볼 수 있습니다 (위의 '1'및 '알 수 없음'). 지금 조작 한 날짜 필드/열에는 큰 따옴표가 붙어있어서 SQL은 만족스럽지 않습니다. 내가 날짜 필드를 조작하지 않으면 더 명확성을 위해
, 그것은 올바르게 따옴표가없는,하지만 SQLServer에 허용되는 형식으로 더 이상 :
<- bind_param(19, '1')= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(20, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(21, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(22, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(23, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(24, undef)= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(25, 'Fri Dec 20 14:56:54 2013')= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(26, 'Fri Dec 20 14:55:37 2013')= (1) [1 items] at upload_merged_host.pl line 71
<- bind_param(27, 'Unknown')= (1) [1 items] at upload_merged_host.pl line 71
는 포인터/제안 싶어요!
업데이트 : @ Vinbot의 의견은 저에게 뭔가를 시도했습니다. UnixDate에서 날짜 문자열을 조작하는 대신, 시작 부분에서 요일을 잘라내는 것이 어떻습니까? 이제 다음과 같이 보입니다.
$ fields [$ i] = substr ($ fields [$ i], 4);
그리고 내가 무엇을 추적 에보고하고있어 지금은 갈 수 있어야한다 :
...
<- bind_param(25, 'Dec 20 15:33:42 2013')= (1) [1 items] at upload_merged_host.pl line 93
...
하지만 난 여전히 이전과 같은, 주조 오류를 받고 있어요. 동일한 형식을 SQL에 직접 사용할 때 문제가 없습니다 (예 : SQL Server 관리 스튜디오를 통해).
INSERT INTO <schema>.dbo.host(hostname,interface_ipaddress,interface_name,host_modified_date) VALUES ('some_host','10.1.1.1','Local Area Connection','Dec 20 15:33:42 2013')
잘 작동합니다.
갱신 2
(적어도, 기능의 I 여전히 변화를 최적화해야하지만) 나는 수 사용은 다른 날짜 조작 루틴이고 문제는 이제 해결됩니다.
해결 방법은 DateTime 및 DateTime :: Format :: DBI를 사용하는 것이 었습니다. 현재로서는 CSV에서 DateTime-> new()로 전달한 다음 DateTime :: Format :: DBI-> format_datetime()에 해당 값을 전달할 때 날짜 문자열을 수동으로 조작해야합니다.
잠을 자고 싶을 때 방금 내가 한 무력의 일부를 잘라낼 수 있기를 바랍니다! :)
내 스파이 지언은 서식에 슬래시가 필요하다는 사실과 관련이 있다고합니다. 당신이 그들을 제거하면, 그것을 단일 인용합니까? – Vinbot
바인딩하지 않고 적절한 형식을 지정하면 제대로 작동합니다. – Hambone
매개 변수가 전달하는 값과 정렬되지 않을 수 있습니까? 그들 중 36 명과 함께, 하나는 쉽게 빠져 나올 것이라고 생각할 것입니다. bind_param은 실제로 Perl 관용구처럼 0이 아니라 1에서 시작한다고 생각합니다. 날짜 필드만으로 스 니펫을 다시 시도해 볼 수 있습니까? – Hambone