Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Dan zou je namelijk met nl2br de 'onzichtbare' line-end zichtbaar kunnen maken door er <br />-tags van te maken....
Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
oei das een goeie stom ddak daar niet zelf op ben gekomen lolthomaske schreef op donderdag 12 april 2007 @ 11:10:
Om CSV-bestanden uit te lezen heeft php een speciale functie: fgetcsv() . Ik neem aan dat deze functie de CSV netjes uitleest en de newlines juist interpreteert..
maar hier kwam ik net achter:
regel 1,"regel 2
regel 2",regel 3
ofwel die alt+enter waarden word tussen "" gezet. Nu ik in principe al zelf de applicatie heb gemaakt en redelijk tot bijna af is ga ik niet meteen over op die fgetcsv() functie.
Alleen als het hard nodig zal zijn zal ik eens kijken anders ga ik een hoop aanpaswerk tegemoet
dit dusJanoz schreef op donderdag 12 april 2007 @ 11:17:
Het is geen 'alt-enter'. Dat is inderdaad wel de toetscombinatie die je in excel gebruikt, maar in het csv bestand is het gewoon en newline. Dit had je ook kunnen zien door de csv gewoon eens in notpad (oid) te openen. Veel simpele csv interpreters gaanhiermee de fout in omdat ze standaard uitgaan van 1 rij per regel. Als je echter kijkt in het bestand dan kun je zien dat het veld omsloten is met quote's. Een fatsoenlijke csv interpreter zal de newlines binnen deze quotes niet als 'rijscheiders', maar als onderdeel van het veld zien.
ik ga er maar even vanuit dat ik in dat geval beter voor die functie kan gaan om verdere problemen te omzijlen.
ff vraagje betreft fgetcsv voorbeeld:
1
| while ($data = fgetcsv ($fp, 1000, ",")) |
waar slaat die 1000 op? ofwel wat houd die int length precies in?
De length parameter moet groter zijn dan de langste lijn vindbaar in het CSV bestand.
Dus aantal records/regels neem ik aan.
In mijn geval kan dit ENORM varieren
Anyway bedankt!
ik kan dus even verder knutselen vanavond
[ Voor 65% gewijzigd door Tijgertje84 op 12-04-2007 11:23 ]
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Wel eens van een handleiding gehoord???Tijgertje84 schreef op donderdag 12 april 2007 @ 11:18:
waar slaat die 1000 op? ofwel wat houd die int length precies in?
De length parameter moet groter zijn dan de langste lijn vindbaar in het CSV bestand.
Dus aantal records/regels neem ik aan.
In mijn geval kan dit ENORM varieren. Is deze niet optioneel ofwel kan ik deze leeg laten?
Veel duidelijker kan het niet worden vermoed ik........length (Optional)
Must be greater than the longest line (in characters) to be found in the CSV file (allowing for trailing line-end characters). It became optional in PHP 5. Omitting this parameter (or setting it to 0 in PHP 5.0.4 and later) the maximum line length is not limited, which is slightly slower.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
sorry maar ik had de nl versie waar het niet zo uitgebreid bij stondJanoz schreef op donderdag 12 april 2007 @ 11:25:
[...]
Wel eens van een handleiding gehoord???
[...]
Veel duidelijker kan het niet worden vermoed ik........
alleen dit: "De length parameter moet groter zijn dan de langste lijn vindbaar in het CSV bestand."
dus jah vandaar mijn vraag ok
en hoe kom ik anders aan mijn vraag betreft het voorbeeld van de handleiding
alleen aangeizen ik geen PHP5 heb zal ik dus verplicht een lengte op moeten geven maar dat is geen probleem
[ Voor 9% gewijzigd door Tijgertje84 op 12-04-2007 11:32 ]
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
deze functie werkt alleen voor maar 1 regel....
ik maak gebruik van csv bestanden met meerdere records (gemiddled 100)
hoe kan ik dat dan oplossen?
als ik file() gebruik dan gooit hij alles in een array zoals ik wil maar het klopt niet zoals iedereen wel zal begrijpen
ik heb een csv bestand met de onderstaande opmaak in wordpad:
1
2
3
4
5
6
| woord;woord;woord;woord;woord;woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" |
ik wil dus in principe net als dit voorbeeld alle gegevens van elke record in een array krijgen.
met fgetcsv() krijg ik alleen 1 regel ( de bovenste) terug
1
2
3
| $file = fopen("woord.csv", "r"); $csv = fgetcsv($file,1000,';','"'); //de ';','"' om te zorgen dat hij dan elke waarde van de regel spit etc info($csv ); // eigen sscriptje voor duidelijker overzicht dan var_dump() |
hiermee krijg ik dan
1
2
3
4
5
6
7
8
9
10
11
| Array
(
[0] => woord
[1] => woord
[2] => woord
[3] => woord
[4] => woord
[5] => woord
[6] => woord
woord woord
) |
Maar dit wil in dus niet.
Heb het hele systeem eigenlijk zo gebouw dat hij van de csv ammel records wegzet in de array met de opmaak etc van de csv zelf waarna ik per record ga exploden op ; om zo tijd te verminderen
dit werkt dus met file(), alleen kan hij niet werken met die "alt-enter" ofwel "woord woord woord" gedeelte helaas
1
| $file = file("woord.csv"); |
dit maakt hier helaas dit van:
1
2
3
4
5
6
7
8
9
| Array
(
[0] => woord;woord;woord;woord;woord;woord;"woord
[1] => woord woord"
[2] => woord;woord;woord;woord;woord;woord;"woord
[3] => woord woord"
[4] => woord;woord;woord;woord;woord;woord;"woord
[5] => woord woord"
) |
dit klopt dus niet zoals ik al zei omdat file() niet controleerd op de tekens van een csv bestand...
mijn doel is om gewoon dit te krijgen:
1
2
3
4
5
6
| Array
(
[0] => woord;woord;woord;woord;woord;woord;"woord woord woord"
[1] => woord;woord;woord;woord;woord;woord;"woord woord woord"
[2] => woord;woord;woord;woord;woord;woord;"woord woord woord"
) |
dan kan ik gemakkelijk alle waarden eruit halen en vervolgens alle andere activiteiten die nodig zijn...
Maarjah hoe kan ik fatsoenlijk voor elkaar krijgen?
Ben al vele uren aan het proberen geweest sinds de start van dit topic maar zonder succes.
Het gaat er gewoon om dat ik een csv kan openen met meerdere records in principe die dan vervolgens weg worden geschreven naar een array().
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Je leest nog steeds de handleiding niet. De 1e regel in de handleiding leest "fgetcsv — Gets line from file pointer and parse for CSV fields" en de eerste example in de handleiding is genaamd "Read and print the entire contents of a CSV file".Tijgertje84 schreef op zaterdag 14 april 2007 @ 20:23:
nou fgetcsv gaat niet werken bij mij
deze functie werkt alleen voor maar 1 regel....
Nofi, maar als je niet wil lezen wat je aan het doen bent valt er voor ons niet tegenop te helpen.
{signature}
zuchtVoutloos schreef op zaterdag 14 april 2007 @ 20:29:
[...]
Je leest nog steeds de handleiding niet. De 1e regel in de handleiding leest "fgetcsv — Gets line from file pointer and parse for CSV fields" en de eerste example in de handleiding is genaamd "Read and print the entire contents of a CSV file".
Nofi, maar als je niet wil lezen wat je aan het doen bent valt er voor ons niet tegenop te helpen.De gemiddelde csv beslaat wel meer dan 1 regel, dus je hebt niet te maken met een zeer exceptioneel probleem of zo.
ofwel dat duid op het einde van een record van een csv imo...
maar een standaard CSV eindigd niet met een , die eindigd namelijk met NIETS
geen eind teken te zien
edit:
nu heb ik precies de hele code gekopieerd en uitgetest jah forget it dat werkt nog steeds niet en doet precies wat er in mijn vorige post al stond
dit is de respons van de voorbeeld:
1
2
3
4
5
6
7
8
9
10
11
12
| 1 fields in line 1: woord;woord;woord;woord;woord;woord;"woord 1 fields in line 2: woord woord" 1 fields in line 3: woord;woord;woord;woord;woord;woord;"woord 1 fields in line 4: woord woord" 1 fields in line 5: woord;woord;woord;woord;woord;woord;"woord 1 fields in line 6: woord woord" |
dus tjah dat gaat gewoon niet werken tenzij ik perse aan het einde van mijn records een of ander teken pleur wat dan in principe nergens anders meer mag voorkomen omdat hij anders daar weer verkeerd gaat splitten.
[ Voor 27% gewijzigd door Tijgertje84 op 14-04-2007 20:46 ]
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Wat eindigt? Je bedoelt dat een regel eindigt, en die eindigt inderdaad niet met een direct zichtbaar character. Parsers kunnen niet dankzij aardstralen weten wanneer een regel eindigt, dus er staat wel gewoon IETS.Tijgertje84 schreef op zaterdag 14 april 2007 @ 20:34:
maar een standaard CSV eindigd niet met een , die eindigd namelijk met NIETSnet nog geprobeerd met excel een bestand opslaan als csv en dan kladblok/wordpad openen..
geen eind teken te zien
Wat wil je niet? Je wil niet een element per field, maar gewoon 1 string. Explode() ken je al, maar kijk eens naar implode. Een simpele implode zorgt al voor het gewenste resultaat.Tijgertje84 schreef op zaterdag 14 april 2007 @ 20:23:
PHP:
1 2 3 $file = fopen("woord.csv", "r"); $csv = fgetcsv($file,1000,';','"'); //de ';','"' om te zorgen dat hij dan elke waarde van de regel spit etc info($csv ); // eigen sscriptje voor duidelijker overzicht dan var_dump()
hiermee krijg ik dan
code:
1 2 3 4 5 6 7 8 9 10 11Array ( [0] => woord [1] => woord [2] => woord [3] => woord [4] => woord [5] => woord [6] => woord woord woord )
Maar dit wil in dus niet.
NB: jouw info() functie lijkt nogal op de standaard aanwezig print_r() functie.
Waarom nou weer dat voorbeeld niet aanpassen voor de field delimiters die jij gebruikt? Hoe moet fgetcsv nou slim parsen als deze niet eens de correcte field delimiter ingefluisterd krijgt? Die laatste aanpak is ook geen oplossing, want je verschuift dan het probleem: je krijgt nog steeds ongewenst gedrag bij een bepaalde string.Tijgertje84 schreef op zaterdag 14 april 2007 @ 20:34:
edit:![]()
nu heb ik precies de hele code gekopieerd en uitgetest jah forget it dat werkt nog steeds niet en doet precies wat er in mijn vorige post al stond
dit is de respons van de voorbeeld: ....
dus tjah dat gaat gewoon niet werken tenzij ik perse aan het einde van mijn records een of ander teken pleur wat dan in principe nergens anders meer mag voorkomen omdat hij anders daar weer verkeerd gaat splitten.
{signature}
btw betreft dat einde is dom nagedacht van mij
ik snap dat ook wel dat ik mijn eigen delimiter daar moet neer zetten.
maar heb alles al geprobeerd van niets tot , tot /r tot ruw CRLF ingepleurd
maar weet gewoon niet wat ik daar in moet zetten...
het enigste teken waar hij op reageerd is de ; die natuurlijk overal in die csv staan
[ Voor 17% gewijzigd door Tijgertje84 op 14-04-2007 21:18 ]
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Daarvoor is PHP Excelreader heel geschikt.
Ben je meteen van dat gedoe met die enters af.
Voorbeeldje:
1
2
3
4
| $new_data = preg_replace_callback("@\"([^\r\n]+)[\r\n]+[^\"]*\"@", create_function('$matches', 'return preg_replace("@[\r\n]+@", " ", $matches[0]);'), $data); |
Hiermee verandert
1
2
3
4
5
6
7
8
| woord;woord;woord;woord;"woord woord";woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" |
in
1
2
3
| woord;woord;woord;woord;"woord woord";woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" woord;woord;woord;woord;woord;woord;"woord woord woord" |
doe-het-zelf-voorbeeld
Verklaring: de preg_replace_callback zoekt stukken tekst met een linebreak erin die tussen aanhalingstekens staat. De callbackfunctie die aangemaakt wordt zoekt vervolgens op alle linebreaks in die tekst en haalt ze eruit. Niet de mooiste oplossing, maar gok dat't wel precies doet wat jij nodig hebt..
dat lijkt er inderdaad beter op! bedanktFragFrog schreef op zondag 15 april 2007 @ 03:48:
Als je geen end-of-line char gebruikt (wat me trouwens sterk lijkt dat je dat niet aan kan zetten bij het exporteren uit Excel, maargoed) is de enige manier waarop je parser kan zien of een newline in een veld zit of het einde van een regel aanduid door te kijken naar de quotes eromheen. In principe zou je dat vrij eenvoudig met een regexp moeten kunnen bepalen.
Voorbeeldje:
PHP:
1 2 3 4 $new_data = preg_replace_callback("@\"([^\r\n]+)[\r\n]+[^\"]*\"@", create_function('$matches', 'return preg_replace("@[\r\n]+@", " ", $matches[0]);'), $data);
Verklaring: de preg_replace_callback zoekt stukken tekst met een linebreak erin die tussen aanhalingstekens staat. De callbackfunctie die aangemaakt wordt zoekt vervolgens op alle linebreaks in die tekst en haalt ze eruit. Niet de mooiste oplossing, maar gok dat't wel precies doet wat jij nodig hebt..
maar welke waarde moet ik in de plaats van de $data zetten? Het moet een mixed var zijn maar hoe krijg ik de waarde uit een csv in een mixed var want kan het alleen of in een array met file() krijgen of in een resource met fopen()
in jouw voorbeeld gaat dit alleen voor een string op begrijp ik
[ Voor 17% gewijzigd door Tijgertje84 op 15-04-2007 12:36 ]
Intel© Conroe E6600 | Asus P5Q PRO Turbo | Sapphire Vapor-X HD5770 1GB | G.E.I.L. 2 GB DDR2-667 Kit CL4 4-4-12 | WD Caviar SE16 2x250GB (S-ATA2) (Raid0) | Sunbeam Trio | Chaintec CFT-500A | Windows XP Pro SP3 | Samsung Syncmaster S23A350H
Tja, hij wil geen harde enters in z'n applicatie, dan kun je weinig anders vrees ik. Eventueel zou je wel ervoor kunnen kiezen om zo'n linebreak om te zetten in een <br /> in plaats van een spatie, tijdens weergave op't net ziet het er dan toch uit zoals het in het oorspronkelijke veld staat, bovendien heb je dan een redelijk unieke delimiter voor het veld.DaCoTa schreef op zondag 15 april 2007 @ 10:51:
Ik weet niet hoe kritisch het allemaal is, maar met deze oplossing verander je wel de invoer van de gebruiker. Waar eerst een newline stond, staat nu een spatie. Mag dat?
Zijn natuurlijk meerdere opties voor. Het handigste voor jou is denk ik gebruik te maken van een array callback icm file(). Dat zou er zo uitzien:Tijgertje84 schreef op zondag 15 april 2007 @ 12:33:
dat lijkt er inderdaad beter op! bedankt
maar welke waarde moet ik in de plaats van de $data zetten? Het moet een mixed var zijn maar hoe krijg ik de waarde uit een csv in een mixed var want kan het alleen of in een array met file() krijgen of in een resource met fopen()
in jouw voorbeeld gaat dit alleen voor een string op begrijp ik
1
2
3
4
5
6
7
8
| function cleanExcelData($data) { return preg_replace_callback("@\"([^\r\n]+)[\r\n]+[^\"]*\"@", create_function('$matches', 'return preg_replace("@[\r\n]+@", " ", $matches[0]);'), $data); } $new_data = array_map("cleanExcelData", $data); |
Andere optie is gebruik te maken van file_get_contents() in plaats van file() zodat je't bestand als string inleest in plaats van array
Overigens is dit wel heel erg basic (fopen leest bijvoorbeeld geen bestand in, het opent slechts een filepointer naar een bestand, wat ook gewoon in de handleiding staat. Als je het bestand daarna daadwerkelijk in een string wilt zetten moet je gebruik maken van fread() - alhoewel file / file_get_contents makkelijkere equivalenten zijn), als je hier meer mee wilt doen raad ik je toch echt aan je er wat verder in te verdiepen, PHP is zowat de simpelste taal die ik ken, zoveel moeite kan dat niet kosten. Doe je dat niet heb je kans dat je op een gegeven moment een bedrijfscritische applicatie plat hebt liggen omdat je van-internet-geplukte-scriptje niet rekening hield met een bepaald geval..
//edit
Bedenk me net dat als je met file werkt je kans hebt dat je records alsnog verkeerd ingelezen worden omdat de newline in je bestand dan alsnog als nieuw array-item gezien wordt, dus dan moet je toch file_get_contents gebruiken
[ Voor 4% gewijzigd door FragFrog op 16-04-2007 23:20 ]
