uppdatera Mysql databas med csv-fil

Permalänk
Medlem

uppdatera Mysql databas med csv-fil

Hej.

Jag har letat över hela internet nu efter ett sätt att ersätta en databas med en csv-fil. När man gör en vanlig importering av en fil som lägger den bara till raderna i databasen...skulle vilja hitta ett sätt att antingen så ersätter den hela databasen med den uppdaterade csv-filen eller så kollar den om de raderna som finns i filen redan finns i databasen och ersätter dom inte...

jag vill inte bli hänvisad till en massa sidor där det finns koder och förklaringar då jag troligen redan varit där och kollar det måste finnas en enkel input som jag kan använda till detta.

Jag provade med denna:

LOAD DATA INFILE 'data.csv' REPLACE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES

Denna kod lade bara till samma information som redan fann i databasen

hoppas jag förklarade detta på ett förståligt sätt...

Visa signatur
Permalänk
Medlem
Skrivet av 522167:

Hej.

Jag har letat över hela internet nu efter ett sätt att ersätta en databas med en csv-fil. När man gör en vanlig importering av en fil som lägger den bara till raderna i databasen...skulle vilja hitta ett sätt att antingen så ersätter den hela databasen med den uppdaterade csv-filen eller så kollar den om de raderna som finns i filen redan finns i databasen och ersätter dom inte...

jag vill inte bli hänvisad till en massa sidor där det finns koder och förklaringar då jag troligen redan varit där och kollar det måste finnas en enkel input som jag kan använda till detta.

Jag provade med denna:

LOAD DATA INFILE 'data.csv' REPLACE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"' IGNORE 1 LINES

Denna kod lade bara till samma information som redan fann i databasen

hoppas jag förklarade detta på ett förståligt sätt...

Kan det vara INSERT IGNORE du letar efter?

Citat:

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are ignored. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error occurs.

LOAD DATA INFILE 'data.csv' INSERT IGNORE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"'

Permalänk
Medlem

...funlkar inte. får förljande felmeddelande:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT IGNORE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"'' at line 2

Visa signatur
Permalänk
Medlem
Skrivet av 522167:

...funlkar inte. får förljande felmeddelande:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT IGNORE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"'' at line 2

Det ska nog vara utan INSERT dock, tror jag.

LOAD DATA INFILE 'data.csv' IGNORE INTO TABLE test FIELDS TERMINATED BY ';' ENCLOSED BY '"'

Permalänk
Medlem

...funkar inte det hellet... detta lägger till alla rader i csv filen till databasen...den tar inte bort något eller uppdaterar något utan lägger bara till alla rader i databasen.

Visa signatur
Permalänk
Medlem

Vad är det egentligen du skall göra ? Vill du uppdatera en befintlig tabell kan du bara importera din datafil i en temporär tabell som och sedan kör en "left join" på den existerande tabellen och lägg till den rader som du inte får träff på ? lite svårt att veta vad du ska göra då jag inte vet vad för information som skall in eller hur SP'n ser ut.

Permalänk
Medlem

Jag har en loggfil som skapas av ett program. Programmet lägger till rader allt eftersom. Jag vill att dessa nya rader ska läggas till i den befintliga databasen utan att de befintliga ska dubbleras.

om filen har 10 rader så läggs dessa 10 rader in i en tom databas.

Nästa gång jag kör filen har den 15 rader...så ska alltså de 5 nya in i databasen utan att de tidigare 10 ska läggas in. Den riktiga filen uppdateras dock med 200-400 rader/dag.

Jag vill att när jag importerar loggfilen ska den antingen tömma databasen och lägga till alla rader på nytt eller kolla av vilka rader som finns, jämföra det med filen och lägga till de nya bara.

Visa signatur
Permalänk
Medlem

Insert into [befintligTabell]
select [dem kolumner som skall in]
from [Loggfil] t1 with (nolock) left join
[befintligTabell] t2 with (nolock) on t1.[unik identifierare] = t2.[unik identifierare]
where
t2.[unik identifierare] is null

Jag hoppas jag har förstått vad du menar men känns ologiskt tänkt ifrån början.

Permalänk
Medlem

ok... ett steg närmare...

Min loggfil ser ut så här:

1;2;3;4;5;6;7;8;9;10;11;12;13;14 1;2;3;4;5;6;7;8;9;10;11;12;13;14

Det är 14 kolimner med bara siffror separerade med semikolon.

Nu är jag väldigt ny med mysql så du behöver förklara lite vad saker betyder.

(nolock) - ska det så något inom parantesen som ska bytas ut?
[unik identifierare] - vad ska det vara för identifierare? Tabellnamn? Kolumnnamn?

Jag tycker det är väldigt logiskt. Lätt till ny data, lägg inte in eller dublicera befintlig data.

Visa signatur
Permalänk
Medlem

Om någon av dessa kolumner är unik för just denna rad så är det denna du skall joina på. Ifall du inte har detta så rekomenderar jag att du lägger till detta. När det kommer till with (nolock) så är det lämpligt att du läser detta http://itknowledgeexchange.techtarget.com/sql-server/what-doe... och nej det är inget du skall byta ut inom parentesen.
Det jag tänkte med ologiskt så var det just att du adderar 200-400 rader varje dag till din loggfil som du sedan ska läsa in till databasen för att sedan uppdatera en tabell. Detta kommer att bli en snöbolls effekt så efter ett tag kommer din loggfil att vara väldigt stor och kommer i sin tur att bli otroligt stor (vet inte hur länge du tänkt uppdatera men kan iaf tänka mig det). Som sagt vet inte allt för mycket angående vad det är du tänkt åstadkomma med detta men låter som om det finns smidigare sätt att lösa detta. Vilket program använder du ? Vart hämtar den information ifrån ? Osv. Har du några frågor så hojta till ska försöka svara så bra som möjligt

Permalänk
Medlem

Jag loggar min pelletsförbrukning via ett program som skapa en rad varje gång den matar pellets till pannan. Filen är en texrfil som kommer att bli väldigt stor till slut. Så som det är just unu så skapar prograet en jpg bild med all data men jag vill ha ut enskild data och placera den på hemsidan min. Killen som gör programmet har inte kopplat det till någon SQL funktion så därför måste jag hitta ett sätt att få över datan själv till SQL

Filen ser egentligen ut så här just nu:

"2013-12-06 16:51:18";1;1;0,00;;4,25;0;0,8;0,0;20,4;0;0;0,983;0 "2013-12-06 16:51:23";2;1;0,01;;7,55;0;1,5;0,0;36,2;0;0;0,764;0 "2013-12-06 16:51:48";1;1;0,00;;2,84;0;0,6;0;13,6;0;0;0,655;0 "2013-12-06 16:54:58";1;3;0,01;;6,96;0;1,4;0,1;34,1;0;0;3,494;0 "2013-12-06 16:55:08";2;4;0,04;;14,68;0;3;0,2;72;0;0;6,334;0 "2013-12-06 16:55:18";3;4;0,07;;24,15;0;4,9;0,3;118,3;0;0;6,334;0 "2013-12-06 16:55:28";4;4;0,09;;33,45;0;6,8;0,5;163,9;0;0;6,225;0 "2013-12-06 16:55:38";5;4;0,12;;42,91;0;8,8;0,6;210,2;0;0;6,333;0 "2013-12-06 16:55:48";6;4;0,15;;52,37;0;10,7;0,7;256,6;0;0;6,333;0 "2013-12-06 16:55:58";7;4;0,17;;61,83;0;12,6;0,8;303;0;0;6,334;0 "2013-12-06 16:56:06";8;5;0,19;;55,21;0;11,3;0,9;270,5;0;0;4,805;0 "2013-12-06 16:59:29";9;8;0,2;;36,14;0;7,4;1;177,1;0;0;2,184;0 "2013-12-06 16:59:39";10;8;0,23;;40,87;0;8,3;1,1;200,3;0;0;6,334;0 "2013-12-06 16:59:49";11;8;0,25;;45,6;0;9,3;1,2;223,4;0;0;6,334;0 "2013-12-06 16:59:59";12;8;0,28;;50,33;0;10,3;1,4;246,6;0;0;6,333;0 "2013-12-06 17:00:09";13;9;0,31;;48,95;0;10;1,5;239,8;0;0;6,334;0 "2013-12-06 17:00:19";14;9;0,33;;53,15;0;10,9;1,6;260,4;0;0;6,334;0 "2013-12-06 17:00:27";15;9;0,35;;56,2;0;11,5;1,7;275,4;0;0;4,586;0

Om det finns några bättre sätt att få in datan i en databas sä är jag väldigt tacksam för förslag.

Visa signatur
Permalänk
Medlem

Du säger att programmet skapar en jpg bild av datan ? Hur får du detta till en csv fil ?

Det jag tänkte var nämligen att ifall du kunde få programmet att dumpa loggfilen en gång varje dag/timme (spelar inte så stor roll) i en mapp. Efter detta så kan du schemalägga en jobb som går in och kontrollerar ifall en ny fil ligger under denna(ifall databasen har åtkomst till denna sökväg), läser in det nya materialet och därefter flyttar filen till en ny mapp t.ex "Importerat".

Permalänk
Medlem

Programmet är lite...knepigt... men det funkar i alla fall Den skapar en loggfil och så utifrån den gör den en jpg fil. Loggfilen uppdaterars som sagt automatiskt varje gång matningen går och det är ofta speciellt nu vintertid.

hur menar du med dumpa? filen har samma namn och samma plats så finns det ert sätt för databasen att plocka info från den enligt schema är det ju det mes optimala. men hur gör jag allt detta?

Visa signatur
Permalänk
Medlem
Skrivet av 522167:

Programmet är lite...knepigt... men det funkar i alla fall Den skapar en loggfil och så utifrån den gör den en jpg fil. Loggfilen uppdaterars som sagt automatiskt varje gång matningen går och det är ofta speciellt nu vintertid.

hur menar du med dumpa? filen har samma namn och samma plats så finns det ert sätt för databasen att plocka info från den enligt schema är det ju det mes optimala. men hur gör jag allt detta?

Jag skulle nog skapat upp en procedure i databasen som hanterar det du vill göra.
Sen sätter du en Event/Job som anropar din procedure, säg en gång i timme.

Din procedure får hantera själva inläsning, kontroll etc.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

Ok så om jag förstår det rätt så är Loggfilen en .csv därefter så skapar den en jpg ?
Jag försöker bara få en större bild av vad som måste göras

Det du måste göra är att du skapar en store procedure som via en "bulk insert" läser in loggfilen till en separat tabell. Därefter så kan du välja ifall du kör en delete på den befintliga informationen som finns (ifall programmet inte kan styras att enbart logga dagens information) och därefter lägger till den nya informationen . Eller ifall du bara vill uppdatera med ny information.

Permalänk
Medlem

och det kan jag inte göra...ve tinte hur man gör sånt... inte än i alla fall. är på väg att lära mig MySQL. om någon har lust att hjälpa mig med det kanske...

Visa signatur
Permalänk
Medlem
Skrivet av 522167:

och det kan jag inte göra...ve tinte hur man gör sånt... inte än i alla fall. är på väg att lära mig MySQL. om någon har lust att hjälpa mig med det kanske...

Kan du några andra programmeringsspråk?
Finns ju inget som säger att du inte kan göra detta i ett annat språk som du kan bättre.

Visa signatur

Corsair 16GB (4x4096MB) CL9 1600Mhz | Asus P8Z77-V PRO |
Samsung SSD Basic 830-Series 256GB | Intel Core i7 3770K 3,5Ghz |
Asus Xonar Essence STX | Noctua NH-U9B SE2 | Antec Performance One P280 | Corsair HX 850W 80+ Gold Modulär | MSI GTX 770

Permalänk
Medlem

nje... kan tyvärr inte några andra språk...

Visa signatur
Permalänk
Medlem

create table Loggtabell (
[date] datetime null,
Kolumn1 varchar(50) null,
Kolumn2 varchar(50) null,
Kolumn3 varchar(50) null,
Kolumn4 varchar(50) null,
Kolumn5 varchar(50) null,
Kolumn6 varchar(50) null,
Kolumn7 varchar(50) null,
Kolumn8 varchar(50) null,
Kolumn9 varchar(50) null,
Kolumn10 varchar(50) null,
Kolumn11 varchar(50) null,
Kolumn12 varchar(50) null,
Kolumn13 varchar(50) null,
Kolumn14 varchar(50 null,
)

bulk insert dbo.Loggtabell from '[Sökväg till din loggfgil]' -- t.ex 'C:\Pellets\Logg\Logg.txt'
with
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
CODEPAGE = 'RAW',
FIRSTROW = 1,
CHECK_CONSTRAINTS,
KEEPNULLS,
MAXERRORS = 0,
ERRORFILE = '[sökvägtillloggfil]\error.txt' -- kan vara bra att ha ifall något går fel
)

Detta kan kanske hjälpa till lite längst vägen men som tidigare sagt så kan det kanske vara lättare om du är mer bekväm med andra språk.

Permalänk
Medlem

Det verkar vara svårare än jag trodde det här.

får fel:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '[date] datetime null, Kolumn1 varchar(50) null, Kolumn2 varchar(50) null, Kol' at line 2

Kanske det är lite för överkurs för mig. Kanske ska låta det var som det är just nu och avvakta på att killen som fixar programmet implementerar SQL stöd.

Visa signatur
Permalänk
Medlem
Skrivet av Subbio:

create table Loggtabell (
[date] datetime null,
Kolumn1 varchar(50) null,
Kolumn2 varchar(50) null,
Kolumn3 varchar(50) null,
Kolumn4 varchar(50) null,
Kolumn5 varchar(50) null,
Kolumn6 varchar(50) null,
Kolumn7 varchar(50) null,
Kolumn8 varchar(50) null,
Kolumn9 varchar(50) null,
Kolumn10 varchar(50) null,
Kolumn11 varchar(50) null,
Kolumn12 varchar(50) null,
Kolumn13 varchar(50) null,
Kolumn14 varchar(50 null,
)

bulk insert dbo.Loggtabell from '[Sökväg till din loggfgil]' -- t.ex 'C:\Pellets\Logg\Logg.txt'
with
(
FIELDTERMINATOR = ';',
ROWTERMINATOR = '\n',
CODEPAGE = 'RAW',
FIRSTROW = 1,
CHECK_CONSTRAINTS,
KEEPNULLS,
MAXERRORS = 0,
ERRORFILE = '[sökvägtillloggfil]\error.txt' -- kan vara bra att ha ifall något går fel
)

Detta kan kanske hjälpa till lite längst vägen men som tidigare sagt så kan det kanske vara lättare om du är mer bekväm med andra språk.

Det du har postat ser mer ut som en MS SQL syntax än MySQL. BULK INSERT finns inte i MySQL

Permalänk
Medlem
Skrivet av yakideo:

Det du har postat ser mer ut som en MS SQL syntax än MySQL. BULK INSERT finns inte i MySQL

DOH! Ne vet inte vad jag ska säga mer än att jag helt var ute och cyklade

Permalänk
Medlem

Sätt unique index på datumfältet så kommer inte några duplicerade rader in i databasen "oavsett" hur du gör.

Permalänk
Medlem

Problemet är som användaren ovan säger att den inte vet vad som är dubbletter eftersom du inte satt vad som får och inte får vara lika.

Visa signatur

Gigabyte P35 DS3 -- Intel Core2Quad 8300 @ 3GHz-- XFX 5830 1GB -- Corsair Dominator 4096MB 1066mhz -- Fractal Design Define R2 -- 60GB OCZ SSD - 320GB Samsung -- Fractal Design 550W