Hallo,

Ik ben zeker geen ervaren PHP scripter maar maak graag gebruik van reeds bestaande scripts.

Ik zocht een script om een csv bestand weer te geven op een website met de mogelijkheid daarin te zoeken en te filteren.
Ik heb deze hier gevonde en voldoed 100% aan mijn verwachtingen:

Echter loop ik tegen 2 problemen aan bij het gebruik van mijn eigen csv:

- Mijn csv bestand heeft speciale caracters in de data, door deze caracters kan het script niet overweg met mijn csv bestand. Het is echter niet mogelijk de data aan te passen dus ik zoek een manier of aanpassing in het script zodat hij deze caracaters wel accepteerd. Het gaat op caracters als: ëâéü etc.
Kan iemand helpen om het script aan te passen zodat deze caracters geen probleem meer vormen?

- Als je in excell een bestand opslaat als csv (komma gescheiden), dan bevat de output geen "," maar een ";" als scheidingsteken.
Is het script aan te passen zodat deze ";" (of zowel "," als ";") als scheidingsteken accepteerd?

Hulp wordt zeer gewaardeerd.

Als iemand wil testen kan ik diegene wel een csv mailen om mee te testen, laat het dan even weten.
Mijn dank is groot.
Hallo Bart,

Beiden probleempjes zijn waarschijnlijk erg simpel op te lossen.

1. zorg dat je <meta charset="utf-8"> aangeeft in je header:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>My Document</title>
</head>

<body>
</body>
</html>


2. ergens in je code staat letterlijk iets als ',' En dat dient vervangen te worden door je raadt het al: ';' Indien je wilt dat wij meekijken zou je het relevante stukje code kunnen posten.
Hallo Frank,

Alvast dank voor het meedenken.

Het zal waarschijnlijk simpel zijn als je wat verder gevorderd bent met php dan ik ;-)

Hieronder in ieder geval de 2 bestanden waar het om draaid.

De index.php:

<?php error_reporting(0);?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  <title>Simplest example of csvtoservice.php</title>
  <link rel="stylesheet" href="http://yui.yahooapis.com/2.7.0/build/reset-fonts-grids/reset-fonts-grids.css" type="text/css">
  <link rel="stylesheet" href="styles.css" type="text/css">
</head>
<body>
<div id="doc" class="yui-t7">
  <div id="hd" role="banner">
    <h1>Simplest example of csvtoservice.php</h1>
    <ul><li><a href="index.php">Index</a></li><li><a href="http://github.com/codepo8/csv-to-webservice">Download on GitHub</a></li></ul>
  </div>
  <div id="bd" role="main">
<?php 
  include('csvtoservice.php');
  $content = csvtoservice('http://cockheyt.tk/database/csv/1112.csv');

  // if it could be loaded and parsed...
  if($content){

    // show the form
    echo '<h2>Filters</h2>';
    if($content['form']){
      echo $content['form'];
    }
    // show the table
    if($content['table']){
      echo '<h2>Results</h2>';
      echo $content['table'];
    }
  }
?>
  </div>
<div id="ft" role="contentinfo"><p>Written by <a href="http://wait-till-i.com">Chris Heilmann</a>, powered by <a href="http://developer.yahoo.com/yql/">YQL</a> - demo csv by the <a href="http://www.guardian.co.uk/news/datablog">Guardian Data Blog</a>.</p></div>
</div>
</body>
</html>

Het script:

<?php
/*
CSV to Webservice by Christian Heilmann
Homepage: http://isithackday.com/csvtowebservice/index.php
Copyright (c)2010 Christian Heilmann
Code licensed under the BSD License:
http://wait-till-i.com/license.txt
*/
function csvtoservice($url,$options){
$csv = get($url);
$lines = preg_split('/\r?\n/msi',$csv);
$columns = split(',',
strtoLower(
preg_replace('/\s/','',$lines[0])
)
);
$colstring = join(',',$columns);

if($options['preset']){
$pres = $options['preset'];
foreach(array_keys($pres) as $p){
$presetstring .= ' and '.$p.' like "%'.$pres[$p].'%"';
}
$columns = array_diff($columns,array_keys($pres));
}

if($options['filter']){
$columns = array_diff($columns,$options['filter']);
}

if($options['prefill']){
foreach(array_keys($options['prefill']) as $p){
if(!isset($_GET[$p])){
$_GET[$p] = $options['prefill'][$p];
}
}
}

if($options['rename']){
$renames = array_keys($options['rename']);
foreach($columns as $k=>$c){
foreach($renames as $r){
if(!in_array($c,$renames)){
$displaycolumns[$k] = $c;
} else {
if($c == $r){
$displaycolumns[$k] = $options['rename'][$r];
}
}
}
}
} else {
$displaycolumns = $columns;
}

foreach($columns as $c){
filter_input(INPUT_GET, $c, FILTER_SANITIZE_SPECIAL_CHARS);
$fromget[$c] = $_GET[$c];
}

$current = preg_replace('/.*\/+/','',$_SERVER['PHP_SELF']);

$csvform = '<form action="'.$current.'">';
foreach($columns as $k=>$c){
$csvform .= '<div><label for="'.$c.'">'.
($options['uppercase'] ?
ucfirst($displaycolumns[$k]) :
$displaycolumns[$k]).
'</label>'.
'<input type="text" id="'.$c.'" name="'.$c.
'" value="'.$fromget[$c].'"></div>';
}
$csvform .= '<div id="bar"><input type="submit" name="csvsend"'.
' value="search"></div>';
$csvform .= '</form>';

if(isset($_GET['csvsend'])){
$yql = 'select * from csv where url="'.$url.'" '.
'and columns="'.$colstring.'"';
foreach($columns as $c){
if(isset($_GET[$c]) && $_GET[$c]!=''){
$yql .= ' and '.$c.' like "%'.$_GET[$c].'%"';
}
}
$yql .= $presetstring;
$yqlquery = '<div id="yql">'.$yql.'</div>';

$yqlendpoint = 'http://query.yahooapis.com/v1/public/yql?format=json';
$query = $yqlendpoint.'&q='.urlencode($yql);
$data = get($query);
$datadecoded = json_decode($data);

$csvtable = '<table><thead><tr>';
foreach($columns as $k=>$c){
$csvtable .= '<th scope="col">'.
($options['uppercase'] ?
ucfirst($displaycolumns[$k]) :
$displaycolumns[$k]).
'</th>';
}
$csvtable .= '</tr></thead><tbody>';
if($datadecoded->query->results->row){

foreach ($datadecoded->query->results->row as $r){
$csvtable .= '<tr>';
foreach($columns as $c){
$csvtable .= '<td>'.$r->$c.'</td>';
}
$csvtable .= '</tr>';
}
} else {
$csvtable .= '<tr><td class="error" colspan="'.sizeof($columns).
'">No results found. Bummer.</td></tr>';
}
$csvtable .= '</tbody></table>';
}
return array(
'table'=>$csvtable,
'form'=>$csvform,
'query'=>$yqlquery,
'json'=>$data
);
}

function get($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
vervang regel vijf eens voor:


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


en als dat niet helpt voor


<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2" />


Worden de karakters dan wel juist weergegeven?

[size=xsmall]Toevoeging op 18/01/2014 12:08:25:[/size]

p.s. Kun je bevestigen dat het in de csv wel juist staat? (dus lees je daar echt een é of ô enzovoorts)
Het ";" probleem lijkt opgelost:


function csvtoservice($url,$options){
  $csv = get($url);
  $lines = preg_split('/\r?\n/msi',$csv);
  $columns = split(',',
              strtoLower(
                preg_replace('/\s/','',$lines[0])


aangepast naar: (regel 4)

function csvtoservice($url,$options){
  $csv = get($url);
  $lines = preg_split('/\r?\n/msi',$csv);
  $columns = split(';',
              strtoLower(
                preg_replace('/\s/','',$lines[0])


Hij laad nu wel de csv maar kan pas echt testen of het volledig werkt als ook het caracter probleem is opgelost.
Pas csvtoservice.php even aan op regel 9 t/m 17 voor het volgende:

<?php
function csvtoservice($url,$options, $splitter = ','){
$csv = get($url);
$lines = preg_split('/\r?\n/msi',$csv);
$columns = split($splitter,
strtoLower(
preg_replace('/\s/','',$lines[0])
)
);
$colstring = join($splitter, $columns);
?>

Hallo Frank,

Beide aanpassingen van jou hebben helaas geen resultaat.

Ik heb zelf zo'n vermoeden dat het al misgaat in het script welke aangesproken wordt (2e deel) en niet op de index.php zelf aangezien die enkel weergeeft wat het script terugstuurt.
Okee dat laatste had ik net nog niet gelezen.

als je het doet zoals ik opgeef dan kun je in de functie aanroep aangeven welk teken je gebruikt.

<?php
$content = csvtoservice('http://cockheyt.tk/database/csv/1112.csv', NULL, ';');
?>
Frank Nietbelangrijk op 18/01/2014 12:16:38

Pas csvtoservice.php even aan op regel 9 t/m 17 voor het volgende:

<?php
function csvtoservice($url,$options, $splitter = ','){
$csv = get($url);
$lines = preg_split('/\r?\n/msi',$csv);
$columns = split($splitter,
strtoLower(
preg_replace('/\s/','',$lines[0])
)
);
$colstring = join($splitter, $columns);
?>




Moet dat geen ";" op regel 9? ;-)
Dan werkt hij wel namelijk....(behalve de caracters dan)

Je kunt meekijken op
Wat excel als scheidingsteken gebruikt, kun je bij het opslaan in Excel prima aangeven. Als je het leuk vindt, kun je daar ook wel een # voor gebruiken etc.

Dat terzijde.

Het stuk code waarin preg_split() staat, is een beetje jammer: daar wordt op elke ";" gesplitst. Ook als dat een puntkomma is die in een tekst staat.
http://nl1.php.net/manual/en/function.str-getcsv.php is dan slimmer
Ivo P op 18/01/2014 12:23:11

Wat excel als scheidingsteken gebruikt, kun je bij het opslaan in Excel prima aangeven. Als je het leuk vindt, kun je daar ook wel een # voor gebruiken etc.

Dat terzijde.

Het stuk code waarin preg_split() staat, is een beetje jammer: daar wordt op elke ";" gesplitst. Ook als dat een puntkomma is die in een tekst staat.
http://nl1.php.net/manual/en/function.str-getcsv.php is dan slimmer



Dat zou best kunnen kloppen, voordeel is dat er geen ";" gebruikt wordt in de data dus das geen probleem in mijn geval.
Dus op zich is het scheidingsteken probleem "opgelost", dank alvast hiervoor.
Nu het caracterprobleem nog....

Reageren