The Information Lab

Snowflake-fout: Veldscheidingsteken gevonden terwijl recordscheidingsteken wordt verwacht

Geschreven door Mike Droog | Apr 13, 2021 8:00:00 AM

Tijdens het werken aan wat gegevens en het importeren van een paar bestanden uit een s3 emmer, kwam Snowflake een fout tegen die me te veel tijd kostte om uit te zoeken: Veldscheidingsteken ',' gevonden terwijl recordscheidingsteken '\n' werd verwacht.

Om te beginnen gebruik ik een eenvoudig csv-bestandsformaat:

create or replace file format my_csv_format type = csv record_delimiter = '\n' field_delimiter = ',' skip_header = 1 null_if = ('NULL', 'null') empty_field_as_null = true

De bestanden die ik importeer zijn als volgt opgebouwd :

74942,”Trading Alliance”,1492176193,80,Cooperative,,,,1
Regelvoorbeeld uit het csv-bestand

Zoals je kunt zien, wordt het veld gescheiden door een ',', lege velden zijn aanwezig en moeten worden behandeld als NULL-waarden, en bij het bekijken van het bestand, kan ik zien dat elke record zijn eigen regel heeft.

Met alles ingesteld, begon ik met importeren, maar al snel kreeg ik de gevreesde foutmelding:

Field delimiter ',' found while expecting record delimiter '\n' File 'factions.csv', line 759, character 85 Rij 758, kolom "FACTIONS"["IS_PLAYER_FACTION":9]

de corresponderende regel :

74927,"Strategic Wings, Order and Retaliation Division",1475489397,80,Cooperative,,,,1
Regel die de fout geeft

We kunnen eenvoudigweg lezen dat "Snowflake een veldscheidingsteken vindt terwijl het een recordscheidingsteken verwacht", maar wat betekent het? Het betekent gewoon dat Snowflake na een X aantal veldscheidingstekens verwacht dat het volgende scheidingsteken een recordscheidingsteken is. De X is hier het aantal kolommen in de tabel (dat is 8).

Als we het aantal "," tellen, kunnen we de fout zien; deze regel heeft er 9 in plaats van 8! Een van de velden bevat een extra : "Strategic Wings, Order and Retaliation Division". Het veld heeft een "," in de inhoud maar zou niet als scheidingsteken gebruikt moeten worden.

Hier komt een wijziging in het bestandsformaat om de hoek kijken:

FIELD_OPTIONALLY_ENCLOSED_BY maakt het mogelijk om dit soort veldwaarden te verwerken. We moeten Snowflake laten weten dat de velden als geheel kunnen worden omsloten door dubbele aanhalingstekens (").
Ons eerste instinct zou ons vertellen om FIELD_OPTIONALLY_ENCLOSED_BY = " " te gebruiken of FIELD_OPTIONALLY_ENCLOSED_BY ' " ' om dit te laten gebeuren, maar dit is de tweede reden voor het schrijven van dit stuk. Snowflake verwijst hier ook naar in zijn documentatie:

Karakter gebruikt om strings in te sluiten. De waarde kan NONE, een enkel aanhalingsteken (') of een dubbel aanhalingsteken (") zijn. Om het enkele aanhalingsteken te gebruiken, gebruik je de octale of hexadecimale weergave(0x27)

De hexadecimale weergave van een dubbel aanhalingsteken is 0x22, waardoor het nieuwe csv-bestandsformaat :

bestandsindeling maken of vervangen my_csv_format type = csv record_delimiter = '\n' field_delimiter = ',' skip_header = 1 null_if = ('NULL', 'null') empty_field_as_null = true FIELD_OPTIONALLY_ENCLOSED_BY = '0x22'

Meer uitleg of hulp nodig? Bekijk onze trainingspagina en vind de training die het beste bij je past. Je kunt me ook inhuren als consultant!