Era uma questão de caráter de fim-de-linha. O arquivo que está sendo processado foi criado no Windows (usando cr lf), mas meu script estava explodindo em "\ n". Eu criei uma função simples para detectar e retornar qual caractere eol está sendo usado. Não é abrangente nem perfeito, mas é bom o suficiente para o que precisamos em nosso ambiente:
function detect_eol($options){
/*
options
str
*/
$str = $options['str'];
$eol = array(
array('raw' => "\r\n", 'str' => '\r\n'),
array('raw' => "\n", 'str' => '\n')
);
for($x=0;$x<count($eol);$x++){
$cur_eol = $eol[$x];
if(strpos($str, $cur_eol['raw']) !== false){
$retval = $cur_eol;
break;
}
}
return $retval;
}