Dmv SQL een txt bestand inlezen in een SQL database

Status
Niet open voor verdere reacties.

peilert

Gebruiker
Lid geworden
23 nov 2009
Berichten
13
Ik heb een txt bestand die er als volgt uitziet:

1Peter Jansen 19830104
2Sara Bergkamp 20101125
3Coen Rozenkamp 19810621

Op vaste posities staan gegevens. Het lukt me overigens wel om een csv bestand in te lezen, echter moet ik een bestand inlezen waarbij de gegevens niet gescheiden zijn dmv komma's

Voor het inlezen van een csv bestand gebruik ik onderstaand statement. Helaas kan ik deze niet gebruiken voor een txt bestand zonder scheidingstekens.

CREATE TABLE CSVTest
(ID INT,
Voornaam VARCHAR(40),
Achternaam VARCHAR(40),
Geboortedatum SMALLDATETIME)
BULK
INSERT CSVTest
FROM '\\p-fsr-01\afdeling$\digloon\Test import 19-02-2011.txt'
WITH
(
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n'
)
SELECT *
FROM CSVTest
GO;


Wie kan mij op weg helpen.

Alvast bedankt!
 
Peilert,

je kunt een bestand met vaste posities inlezen door de "fieldterminator" niet te gebruiken
je leest dan de complete rij en en moet gaan goochelen met substring en datatypenconversie.

Dat vind leuk en niet zo moelijk, dus ik help je vast een handje

Bijgaand vind je het bestandje wat ik heb gebruikt om te testen.
Bekijk bijlage test.txt

hopelijk heb je er wat aan!

succes,
Mark

[SQL]
SET NOCOUNT ON

IF OBJECT_ID(N'CSVTest',N'U') IS NOT NULL
DROP TABLE CSVTest;
IF OBJECT_ID(N'tempdb..#tempCSV',N'U') IS NOT NULL
DROP TABLE #tempCSV;
GO

CREATE TABLE CSVTest
(
ID INT,
Voornaam VARCHAR(40),
Achternaam VARCHAR(40),
Geboortedatum SMALLDATETIME
);

CREATE TABLE #tempCSV
(
Contents VARCHAR(255)
);
GO

BULK INSERT #tempCSV
FROM 'c:\test.txt'
WITH
(
ROWTERMINATOR = '\n'
)
GO

-- BEPALEN VASTE POSITIES (DEZE MOET JE ZELF CORRIGEREN)
-- volgende data begint NA:
DECLARE @Scheiding1 INT = 10; --VELD 2 BEGINT DUS OP POSTIE 11 ETC..
DECLARE @Scheiding2 INT = 30;
DECLARE @Scheiding3 INT = 50;

INSERT INTO CSVTest
SELECT SUBSTRING(CONTENTS,1,@SCHEIDING1) AS ID,
RTRIM(SUBSTRING(CONTENTS,@SCHEIDING1 + 1,@SCHEIDING2 - @Scheiding1)) AS Voornaam,
RTRIM(SUBSTRING(CONTENTS,@SCHEIDING2 + 1,@SCHEIDING3 - @Scheiding2)) AS Achternaam,
-- Dagen
DATEADD(DAY,CAST(RIGHT(SUBSTRING(CONTENTS,@SCHEIDING3 + 1,8),2) AS INT) - 1,
-- Maanden
DATEADD(MONTH,CAST(SUBSTRING(SUBSTRING(CONTENTS,@SCHEIDING3 + 1,8),5,2) AS INT) - 1,
-- Jaren
DATEADD(YEAR,CAST(LEFT(SUBSTRING(CONTENTS,@SCHEIDING3 + 1,8),4) AS INT) - 1900,0)
)
) AS Geboortedatum
FROM #tempCSV;
DROP TABLE #tempCSV;

SELECT * FROM CSVTest;
[/SQL]
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan