CSV naar database + extra waardes toevoegen (uit db)

Pagina: 1
Acties:

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
Ik ben bezig met het importeeren van een CSV file naar een MySQL database, dit gaat allemaal goed. (via een array)
Nu wil ik ook gelijk dat als hij (b.v.) in myarray(0) een waarde vind die gelijk is aan de waarde in een database dat hij die waarde (uit de database) uitleest
Zodat ik hem erbij kan zetten (in de db).

Hier is mijn code van het importeeren van een CSV file:


Zoals je kan zien gaat het over het importeen van Telefoon gegevens, nu wil ik dus de naam en telefoon die ik aan een nummer heb gegeven in die database erbij zetten.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
dim periode
Dim mystring
dim myarray
dim directory
dim file
dim fullfile


periode = Request.Form("periode")
filename = Request.Form("filename")


set ConnectionToDatabase = server.CreateObject("ADODB.Connection")
ConnectionToDatabase.ConnectionTimeout=60
ConnectionToDatabase.Open ("DSN=vodafone")
set recordset = server.CreateObject("ADODB.recordset")
Recordset.Open "Select * from Vodafone.TblCost", ConnectionToDatabase,1,2

directory = Request.ServerVariables("APPL_PHYSICAL_PATH")
file = filename & ".csv"
fullfile = Directory & file

Set myfilesystem=server.CreateObject("Scripting.FileSystemObject")
Set MyTextStream=myfilesystem.OpenTextFile (fullfile,1)

do until mytextstream.AtEndOfLine
if left(mytextstream.readline,"2") = "06" then
    mystring = mytextstream.readline
    myarray = split(mystring,";", -1, 1)
    
    if myarray(0) >"" then
        recordset.AddNew
        recordset("periode") = periode
        recordset("Telefoon") = myarray(0)
        if myarray(1) > "" then
        recordset("leeg") = myarray(1)
        end if
        recordset("aantal")= myarray(2)
        recordset("duur")= myarray(3)
        recordset("vaste_kosten") = myarray(4)
        recordset("var_gesprekskosten") = myarray(5)
        recordset("overige_gesprekskosten") = myarray(6)
        if myarray(1) > "" then
        recordset("leeg1") = myarray(7)
        end if
        if myarray(1) > "" then
        recordset("kortingen") = myarray(8)
        end if
        recordset("totaal_gesprekskosten") = myarray(9)
        recordset.Update
    end if 
    
end if
loop
recordset.Close
set recordset = nothing

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 19:36

Peetman

Tjah....

Nadat je de waarde van het telefoon nummer hebt uitgelezen doe je een select op de tabel (waar de naam in combo met het tf-nummer in staat) in de database met in de where clause dat telefoonnummer. Als je dan een waarde vindt voor de naam zet je de naam erbij in de database.

Je slaat nu trouwens elke keer een regel over. Je leest namelijk een line in, vergelijkt de eerste 2 karakters met een waarde en als dat waar is lees je de volgende line in. Je kan beter de line inlezen in een variabele, daar de vergelijking op doen en als het dan waar is, de rest van je functie uitvoeren. Anders lees je alleen de gegevens van een regel in als op de vorige regel een 06-nummer stond. Dit lijkt me niet helemaal correct.

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
okee thanks,

ik heb eerst het 'probleem' met het overslaan van regels (volgens mij) gefixed

code:
1
2
3
4
5
6
7
8
9
10
11
do until mytextstream.AtEndOfLine
    mystring = mytextstream.readline
    myarray = split(mystring,";", -1, 1)
    
    if left(myarray(0),"2") = "06" then
        recordset.AddNew
        recordset("periode") = periode
        recordset("Telefoon") = myarray(0)
        if myarray(1) > "" then
        recordset("leeg") = myarray(1)
        end if


Volgens mij werkt dit..

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 19:36

Peetman

Tjah....

Je moet die quotjes om de 2 even weghalen bij die 'if left'. left werkt volgens mij niet met een string als tweede argument. dat zou dan wel moeten werken.

En dan nu je volgende probleem. :)

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
hij werkt :)

heb er even een tellertje bij gezet, na de 37 records die hij moet invoegen komen een paar regels die hij niet moet importeeren..

nu het volgende 'probleem' fixen _/-\o_

  • Boogie
  • Registratie: Januari 2001
  • Laatst online: 24-04 04:51
Ik had een vergelijkbaar probleem, ik heb elke dag een nieuwe csv die de telefooncentrale standaard exporteerd, maar ook een csv met tlefoonnummers van buitendienst en thuiswerkers die dus niet in de telefooncentrale staan. Ik heb dat zoals onderstaand opgelost door 2 maal een csv in te lezen waarvan er dus elke dag nieuw is, en de ander bevat "statische gegevens". Op deze manier kan ik gewoon heel de database elke dag gewoon leeggooien.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
// Connecting, selecting database
$mysql_host = "";
$mysql_login = "";
$mysql_password = "";
$my_database = "telefoon";

// Connect to database
$link = mysql_connect($mysql_host, $mysql_login, $mysql_password)
    or die("Could not connect");
// print "Connected successfully";
mysql_select_db($my_database)
    or die("Could not select database");
// print "Selected successfully";

// Maak de huidige database leeg
    if(mysql_query("DELETE FROM telefoon"))
    {
//      print ("Gegevens zijn verwijderd!");
    }
    else
    {
        print (mysql_error());
    }

// Lees het exportbestand en vul de database 
$fp = fopen ("export\\user.txt","r");

while ($data = fgetcsv ($fp, 1000, ",")) {
    $data[25] = substr(strrchr($data[25],"\\"),1);
    if ($data[17]!="2") {
        if (mysql_query("Insert into telefoon(voornaam, achternaam, telefoonnummer, afdeling, kamer) values ('$data[1]', '$data[11]', '$data[18]', '$data[25]', '$data[28]')"))
            echo $data[1],$data[11],$data[18], $data[25],$data[28],"<br>\n";
        else print (mysql_error());
    }
}
fclose($fp);
// Lees het telefoonnummers bestand van mensen die niet via de centrale zitten zet deze erbij 
$fp = fopen ("export\\telnrs.txt","r");
while ($data = fgetcsv ($fp, 1000, ",")) {
        if (mysql_query("Insert into telefoon(voornaam, achternaam, telefoonnummer, afdeling, kamer) values ('$data[0]', '$data[1]', '$data[2]', '$data[3]', '$data[4]')"))
            echo $data[0],$data[1],$data[2], $data[3],$data[4],"<br>\n";
        else print (mysql_error());
    }
fclose($fp);
?>


Hopelijk heb je hier wat aan! (sorry voor de lay-lout)

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
waarom werkt dit niet?

hij zet bij alle records een waarde neer :(

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
do until mytextstream.AtEndOfLine
    mystring = mytextstream.readline
    myarray = split(mystring,";", -1, 1)
    
    if left(myarray(0),"2") = "06" then
        recordset.AddNew
        
                set recordset2 = server.CreateObject("ADODB.recordset")
                StrSQL = "Select * from Vodafone.TblConnect Where Number='" & telefoon & "'"
                Recordset2.Open StrSQL, ConnectionToDatabase,1,2
        
                If recordset2.eof = true and recordset2.bof = true then 
                    'geen records
                    Response.Write("geen records<BR>")
                    recordset("first_name") = "Not assignt"
                    recordset("last_name") = "Not assignt"
                else
                    'wel records
                    Response.Write("Wel records<BR>")
                    Recordset("first_name") = Recordset2("first_name")
                    Recordset("Last_name") = Recordset2("Last_name")
                    Recordset("Phone") = Recordset2("Phone")
                    Recordset("Department") = Recordset2("Department")
                    Recordset("Company") = Recordset2("Company")
                    Recordset("Costcenter") = Recordset2("Costcenter")
                end if
        
        recordset("periode") = periode
        recordset("Telefoon") = myarray(0)
        if myarray(1) > "" then
        recordset("leeg") = myarray(1)

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
ik heb m al :) in de StrSQL staat telefoon, moet zijn myarray(0)

maar nu heb ik een andere fout.


Microsoft OLE DB Provider for ODBC Drivers error '80040e21'

Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.

/gsm/add_cost_to_db.asp, line 83


regel 83 = Recordset.update

:?

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
Boogie schreef op 26 september 2002 @ 12:09:
Ik had een vergelijkbaar probleem, ik heb elke dag een nieuwe csv die de telefooncentrale standaard exporteerd, maar ook een csv met tlefoonnummers van buitendienst en thuiswerkers die dus niet in de telefooncentrale staan. Ik heb dat zoals onderstaand opgelost door 2 maal een csv in te lezen waarvan er dus elke dag nieuw is, en de ander bevat "statische gegevens". Op deze manier kan ik gewoon heel de database elke dag gewoon leeggooien.

Hopelijk heb je hier wat aan! (sorry voor de lay-lout)
Bedankt voor je PHP ! alleen kan ik geen php

maar als nog bedankt!

  • Peetman
  • Registratie: Oktober 2001
  • Laatst online: 19:36

Peetman

Tjah....

Je zal nog wel aan die telefoon variabele daadawerkelijk het telefoonnummer moeten toekennen. Want volgens mij vergelijk je nu iets met een lege string.

Wat voor waarde zet ie neer?


Kijk hier even voor de odbc error

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
ik snap er helemaaln niks van

geen records = geen match gevonden
Wel records = Wel match gevonden
Done = records toegevoegt aan DB
Not assignt = First_Name (betekent dat hij geen match heeft gevonden)
Not assignt = Last_Name (betekent dat hij geen match heeft gevonden)
teller = 778 = de regel die hij geimporteert heeft

dit is de uitkomst:

geen records
DONE! teller = 778
Not assignt
Not assignt


Wel records
DONE! teller = 779
dsf (= first_name)
fsdfsd (=Last_name)


geen records
DONE! teller = 780
Not assignt
Not assignt

Microsoft OLE DB Provider for ODBC Drivers error '80040e21'

Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.

/gsm/add_cost_to_db.asp, line 86


ik snap het echt niet, hij gaat 778x goed dan vind hij een match! (jipiee) dan weer niet en dan pas gaat hij de fout in..

  • ArjanC
  • Registratie: Juli 2001
  • Laatst online: 26-01 17:16
gvd.. ik heb m,

hij onthield sommige waardes uit recordset2 die wou hij weer gaan gebruiken in Recordset maar dan kan niet omdat recordset2 niet geopend is :)

maarja.. THANKS mates.!
Pagina: 1