Selon l'extrait de code de la source PostgreSQL, copy.c
:
/* Process \n */
if (c == '\n' && (!cstate->csv_mode || !in_quote))
{
if (cstate->eol_type == EOL_CR || cstate->eol_type == EOL_CRNL)
ereport(ERROR,
(errcode(ERRCODE_BAD_COPY_FILE_FORMAT),
!cstate->csv_mode ?
errmsg("literal newline found in data") :
errmsg("unquoted newline found in data"),
!cstate->csv_mode ?
errhint("Use \"\\n\" to represent newline.") :
errhint("Use quoted CSV field to represent newline.")));
cstate->eol_type = EOL_NL; /* in case not set yet */
/* If reach here, we have found the line terminator */
break;
}
cela signifie que vos données d'entrée utilisent l'octet 0x0A
quelque part à l'intérieur de vos chaînes, par ex. vous utilisez "abcNxyz"
, où au lieu de N
en fait il y a un octet avec la valeur 0x0A
.
La solution consiste à utiliser la chaîne "abc\n"
à la place. Vous devriez être en mesure de trouver toutes les fausses nouvelles lignes et de les remplacer par \n
en utilisant un script, peut-être Python ou Perl.