Reading csv file columns and writing them to a new file - php
I've been trying to read a csv file and extract the first two columns and save it into another csv file.
The csv file is tab separated. The code is written do show it on the webpage but when it comes to writing the csv file. It prints on a new line which I don't want. Can anyone tell me what I'm doing wrong or what should I add to get the output in one line per row?
$string = <<<CSV
"IRC_01T_00K_002" "Bonjour monsieur, je m'appelle Léon Bop j'habite au Sénégal, j'ai 28ans. J'étais religieux moine bénédictin et je viens de quitter la vie religieuse il y a 2ans. J'ai fait l'hôtellerie comme la plonge, la sécurité et équipier de cuisine, actuellement je suis commerçant, et depuis quelques temps je cherche un correspondant canadien pour venir immigrer au Canada, puisque c'est mon pays de rêve.\
Voilà mes coordonnées:\
leonbop#gmail.com\
+221775797837." "Wrong Channel" "2018-10-26 13:57:16" "DE8B33B0-C68F-11E8-8BFB-0242AC110004" "2018-10-26 13:57:16" "DE8B33B0-C68F-11E8-8BFB-0242AC110004"
"IRC_01T_00K_002" "bonjour le Canadian immigration je suis au Congo je suis un chauffeur" "Wrong Channel" "2018-10-12 15:53:29" "DE8B33B0-C68F-11E8-8BFB-0242AC110004" "2018-10-12 15:53:29" "DE8B33B0-C68F-11E8-8BFB-0242AC110004"
"IRC_031_000_008" "Thnks so much. I will apply before her status expires. You guys are so helpful \
. I am lucky that I am in canada in people like you ." "Chat Conclusion" "2018-10-24 17:41:50" "380922FF-AB0E-11E8-80D2-0242AC110004" "2018-10-24 17:41:50" "380922FF-AB0E-11E8-80D2-0242AC110004"
"IRC_031_000_008" "Ok thanks a lot" "Chat Conclusion" "2018-10-19 04:19:35" "A4D460D3-F448-1693-BA91-C6A0A40998BB" "2018-10-19 04:19:35" "A4D460D3-F448-1693-BA91-C6A0A40998BB"
CSV;
//$string = str_replace(array('\\','/','\\\\','*','"','<','>','|',"'"), '', $string);
$fp=fopen('test13.csv','w');
$handle = fopen("data://text/plain," . $string, "r");
if ($handle) {
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE)
{
//$num = count($data);
for ($c=0; $c < 2; $c++)
{
echo $data[$c] . "<br />\n";
$data[$c] = str_replace(array('\\','/','\\\\','*','"','<','>','|',"'"), '', $data[$c]);
$data[$c] = preg_replace('/^\h*\v+/m', '', $data[$c]); // remove empty lines
$data[$c] = trim($data[$c]);
fwrite($fp,$data[$c]);
fwrite($fp,"\t");
//fwrite($fp, $data[$c]);
}
fwrite($fp,"\n");
}
fclose($fp);
fclose($handle);
}
Output:
IRC_01T_00K_002 Bonjour monsieur, je mappelle Léon Bop jhabite au Sénégal, jai 28ans. Jétais religieux moine bénédictin et je viens de quitter la vie religieuse il y a 2ans. Jai fait lhôtellerie comme la plonge, la sécurité et équipier de cuisine, actuellement je suis commerçant, et depuis quelques temps je cherche un correspondant canadien pour venir immigrer au Canada, puisque cest mon pays de rêve.
Voilà mes coordonnées:
leonbop#gmail.com
221775797837.
I expect the output to be: "first column" \t "second column". The new csv file created should have two columns and the second column value should be in one single line rather than multiple lines.
You have newlines in the second column of the CSV file. You can replace them with spaces:
data[$c] = str_replace("\n", " ", $data[$c]);
Related
Create a csv file with a lot of txt files
i'm trying to read a lot of txt files and save the first line as a title, and the rest of text as a content, then export to a CSV file. i create a id for CSV that increase by iteration, but when i have an error that i cant see in the iteration because when it save the content in the array add the last content to this value. I need to create a CSV with 3 "columns" named, id, titulo and contenido and by each file, save in a array the information. One txt file, one iteration of array. Sorry for my english. this is my code: <?php /* Cogemos todos los archivos txt de la carpeta archivos del servidor */ $files = glob("archivos/*.txt"); /* Creamos el array para guardar los datos y le metemos la primera línea que es el nombre de los campos a importar */ $datosparacsv=array(array("ID","titulo","contenido")); /* Creamos el id que tendrá cada campo del array para después poder importar */ $id = 0; /* Recorremos cada archivo para coger los datos */ foreach($files as $file) { /* Sacamos el título de la primera línea del archivo txt */ $titulo = trim(fgets(fopen($file, 'r'))); /* Sacamos el resto del contenido pero quitamos la primera linea con el condicional if*/ $archivo = file($file); foreach ($archivo as $num=>$line){ if ($num==0) { continue; } else{ $contenido .= $line."\n"; } } /* Añadimos el contenido extraido al array para luego pasarlo a CSV */ array_push($datosparacsv, array($id,$titulo,$contenido)); /* Sumamos uno al id para que sea único */ $id++; } $delimitador = ','; //parameter for fputcsv $enclosure = '"'; //parameter for fputcsv //convert array to csv $archivocsv = fopen('entradas.csv', 'w+'); foreach ($datosparacsv as $data_line) { fputcsv($archivocsv, $data_line, $delimitador, $enclosure); } $data_read=""; rewind($archivocsv); //read CSV while (!feof($archivocsv)) { $data_read .= fread($archivocsv, 8192); // will return a string of all data separeted by commas. } fclose($archivocsv); echo $data_read; Example of files to read. File 1.txt Titulo 1 texto 1 File 2.txt Titulo 2 texto 2 CSV id, titulo, contenido, 0, Titulo 1, texto 1, 1, Titulo 2, texto 2 Thank you very much mates.
$contenido on line 19 is undefined and it's trying to concatenate a non-existent variable with .=. The $contenido variable also isn't required because each archive line is defined in $datosparacsv. It's also unnecessary to define $delimitador and $enclosure because the defined values are also the default values. Here's the correct PHP code with the expected CSV output with comments explaining each modified line. It also preserves new lines and spaces in content as required. <?php /* Cogemos todos los archivos txt de la carpeta archivos del servidor */ $files = glob("archivos/*.txt"); /* Creamos el array para guardar los datos y le metemos la primera línea que es el nombre de los campos a importar */ $datosparacsv = array( array( "ID", "titulo", "contenido" ) ); /* Creamos el id que tendrá cada campo del array para después poder importar */ $id = 0; foreach($files as $file) { /* Sacamos el resto del contenido pero quitamos la primera linea con el condicional if*/ $archivos = file($file); // Remove and retrieve CSV heading values from each file with array_shift instead of a conditional in each $archivo iteration $titulo = trim(array_shift($archivos)); // Append to the ID and title to the CSV data array with $datosparacsv[] instead of array_push() while incrementing the ID $datosparacsv[$id + 1] = array( $id++, $titulo, '' ); foreach ($archivos as $archivo) { // Append each line from $archivos with preserved spaces and new lines $datosparacsv[$id][2] .= $archivo; } // Trim leading and trailing whitespace $datosparacsv[$id][2] = trim($datosparacsv[$id][2]); } $archivocsv = fopen('entradas.csv', 'w+'); foreach ($datosparacsv as $data_line) { // Add the data to the CSV with the default delimiter and enclosure fputcsv($archivocsv, $data_line); } ?> archivos/1.txt Titulo 1 texto 1 archivos/2.txt Titulo 2 texto 2 texto3 texto4 This saves entradas.csv with this data. ID,titulo,contenido 0,"Titulo 1","texto 1" 1,"Titulo 2","texto 2 texto3 texto4"
i use this forme because i can format my anser better. i need that the whole content of the file less the first line was in the column $contenido. Now, with your code, works fine but if the same file has more than one line after content, it uses each line as a new line of the result. For example i use now this files Archivo 1.txt Titulo 1 texto 1,texto 1 Some more text in file 1 Archivo 2.txt Titulo 2 texto 2, texto 2, texto 2, texto 2, texto 2, texto 2 Some text 2 of the same archive and this generates this entradas.csv ID,titulo,contenido 0,"Titulo 1","texto 1,texto 1" 1,"Titulo 1", 2,"Titulo 1","Some more text in file 1" 3,"Titulo 2","texto 2, texto 2, texto 2, texto 2, texto 2, texto 2" 4,"Titulo 2", 5,"Titulo 2","Some text 2 of the same archive" But i need that: ID,titulo,contenido 0,"Titulo 1","texto 1,texto 1 Some more text in file 1" 1,"Titulo 2","texto 2, texto 2, texto 2, texto 2, texto 2, texto 2 Some text 2 of the same archive" It's important that the contents saves all spaces and \n that they have in the txt file because this txt files are posts of a blog. An example of one file.txt ¿Como puedo comer galletas?<-- Title Las galletas se comen con la boca, poco a poco masticando. <h2>¿Cuántos sabores de galletas hay?</h2> Pues hay de todos los que puedas imaginar. and all of this text after title have to stay in the same line saving \n and all. One file only one line in the CSV. thank you very much and im sorry for my english.
How can I use "for" inside an "array"?
Thank you for your help. I am working on a new site, i would love to generate a CSV from a XML website. But i can't use "for (number...)" inside an array. <?php // output headers so that the file is downloaded rather than displayed header('Content-type: text/csv'); header('Content-Disposition: attachment; filename="demo.csv"'); // do not cache the file header('Pragma: no-cache'); header('Expires: 0'); // create a file pointer connected to the output stream $file = fopen('php://output', 'w'); // send the column headers fputcsv($file, array('Column 1', 'Column 2', 'Column 3')); $json_string = "http://v2.notmaison.be/php/index.php?action=getRealEstateByNotaris¬aris=FRANCE,%20Gilles"; $jsondata = file_get_contents($json_string); $result = json_decode ($jsondata,true); $nombre = count($result['results']); $json = $result['results'][$numero]['im']; $json_decoded = json_decode($json); $data = array( for ($numero = 0; $numero < $nombre ; $numero++) { Array($result['results'][$numero]['re_ru'],"test2","test3") ); } // output each row of the data foreach ($data as $row) { fputcsv($file, $row); } exit(); ?> I have this error : Parse error: syntax error, unexpected 'for' (T_FOR), expecting ')' in /htdocs/biens3.php on line 25
you should use for ($numero = 0; $numero < $nombre ; $numero++) { $data[] = Array($result['results'][$numero]['re_ru'],"test2","test3"); }
Try declaring $data as an empty Array, then for each $nombre you add an item/Array to $data, something liek this: $data = Array(); for($numero = 0; $numero < $nombre; $numero++){ $data[] = Array($result['results'][$numero]['re_ru'],"test2","test3"); }
If your goal is to populate the array, instead of this: $data = array( for ($numero = 0; $numero < $nombre ; $numero++) { Array($result['results'][$numero]['re_ru'],"test2","test3") ); } You can first create the array like you're doing, but just create, and then add the elements with a loop: $data = []; # shorter syntax than array(), but the same. for ($numero = 0; $numero < $nombre ; $numero++) { $data[] = [ $result['results'][$numero]['re_ru'], "test2", "test3" ]; } The syntax $data[] will push elements to the end of the array. Note that you actually don't even need to create the array itself. I also noticed that right after you're looping on the array to output its contents. And since you don't use $data anywhere else after, you could eliminate it and ouptup data in the same loop: for ($numero = 0; $numero < $nombre ; $numero++) { fputcsv($file, [ $result['results'][$numero]['re_ru'], "test2", "test3" ]); );
This is a perfect candidate for the use of foreach rather than a for The code can be simplified down to this $json_string = "http://v2.notmaison.be/php/index.php?action=getRealEstateByNotaris¬aris=FRANCE,%20Gilles"; $jsondata = file_get_contents($json_string); $json_obj = json_decode ($jsondata); $csv_file = fopen('php://output', 'w'); foreach ( $json_obj->results as $result) { // to use all the fields from the json returned fputcsv($csv_file, (array)$result); } Giving output: 25174,CH-82691-16,0,50.4107048,4.4445519,2,12,1,,3,4,,"Appartement meublé (3ème étage) 2 chambres avec cave et garage.<br/>Hall, séjour, cuisine équipée, sdb, wc, buanderie, 2 chambres.<br/>Balcon avant avec tente solaire. Porte blindée. Cave. Garage. Ascenseur.<br/>",,6000,2,0,-1,95000,10,"Rue Basslé",Charleroi,0,1,0,1,-1,-1,1018,-1,-1,1,-1,-1,1,1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 95000 €","S'adresser en l'étude.",-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,,,,,,,,,,,,"Classe B",201611231147,201611281115,contact#notairescharleroi.be,notaire.france#skynet.be,,20161109022084,,,HA,,,,,OFF,,2,Appartements,"un appartement",12,Appartement,Appartement,2,1,Gré-à-Gré,,,,,3,Central,4,Equipée,"[""WEBB-AFYESF"",""WEBB-AFYES7"",""WEBB-AFYES9""]",238 22691,CH-82112-16,0,50.4234543,4.4862727,1,8,1,,9,2,,"Maison de rapport avec 2 appartements.<br/>Hall commun de +/- 16 m².<br/>Appartement rez (+/- 45 m²): chambre (+/- 18 m²), séjour-sàm (+/- 10 m²), cuisine (+/- 4 m²), sdb (+/- 2,5 m²), cour arrière.<br/>Appartement 1er étage (+/- 51 m²): séjour-sàm (+/- 29 m²), chambre (+/- 17 m²), sdb (+/- 3 m²).<br/>Grenier aménageable (+/- 70 m²).<br/>Châssis SV.","Libre à l'acte.",6060,2,60,-1,80000,114,"Rue Hanoteau",Gilly,0,-1,0,0,1,-1,594,-1,-1,-1,-1,-1,1,-1,2,2,-1,-1,-1,2,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 80000 €","S'adresser en l'étude.",1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe E",201607191431,201607250944,contact#notairescharleroi.be,notaire.france#skynet.be,,20160228005227,,,HA,,,,,OFF,,1,Maisons,"une maison",8,"Maison de rapport",Opbrengsteigendom,1,1,Gré-à-Gré,,,,,9,"Foyer gaz",2,"Non équipée","[""WEBB-ABZGY2"",""WEBB-ABZGY5""]",238 15311,CH-80259-15,0,50.4291858,4.4990644,1,7,1,,5,2,,"Maison avec jardin.<br/>Sous-sol: cave.<br/>Rez: sàm, living.<br/>Annexe: cuisine, sdb avec wc séparé, buanderie.<br/>Etage: 2 chambres.<br/>Grenier, jardin.<br/>Châssis PVC double vitrage.",,6060,2,432,-1,55000,31,"Rue Brasserie Gillieaux",Gilly,0,-1,1,0,-1,-1,282,-1,-1,1,-1,-1,-1,1,-1,1,-1,-1,-1,1,-1,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 55000 €","S'adresser en l'étude.",-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe G",201509011601,201601060955,contact#notairescharleroi.be,notaire.france#skynet.be,G,20150507024064,513,60394,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,,,,,5,"Central mazout",2,"Non équipée","[""WEBB-9ZXJLP"",""WEBB-9ZXJLS"",""WEBB-9ZXJMS""]",238 24222,CH-82449-16,0,50.4276111,4.472657,4,39,1,,4,2,,"Immeuble de rapport avec commerce (et cour) au rez et 2 appartements.<br/>Sous-sol de 65 m².<br/>Rez commercial de 70 m²: commerce et pièce arrière avec WC. Cour.<br/>1er étage: appartement de 63 m² avec balcon: cuisine, séjour/sàm, hall, 1 chambre, sdb.<br/>2ème étage: appartement de 70 m² avec balcon: cuisine, séjour/sàm, débarras, hall, WC, sdb, 1 chambre.<br/>CC gaz, 3 chaudières séparées.<br/>citerne eau de pluie. Compteurs gaz et électricité séparés.",,6060,2,147,-1,160000,198,"Chaussée de Lodelinsart",Gilly,0,-1,0,0,-1,-1,1682,-1,-1,2,-1,-1,2,-1,2,2,-1,-1,-1,2,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 160000 €","S'adresser en l'étude.",-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe G",201610101349,201610191534,contact#notairescharleroi.be,notaire.france#skynet.be,,20161003008071,,,HA,,,,,OFF,,4,"Bureaux / Commerces","un bureau / commerce",39,"Maison de rapport",Opbrengsteigendom,4,1,Gré-à-Gré,,,,,4,"Central gaz",2,"Non équipée","[""WEBB-AELG3S"",""WEBB-AEVHX6"",""WEBB-AEVHX8"",""WEBB-AEVHXA"",""WEBB-AEVHXC"",""WEBB-AEVHXE""]",238 24617,CH-82546-16,0,50.3780923,4.3711288,1,7,1,,4,1,5,"Sous-sol : caves<br/>Rez-de-chaussée (40 m²) : hall, séjour, cuisine<br/>1er étage (40m²) : hall, 2 chambres, salle de bain <br/>Grenier aménageable<br/>Jardin et cour<br/>Garage<br/>Chauffage central au gaz <br/>Châssis double vitrage PVC et aluminium<br/>R.C.: 431,00 €<br/>Superficie : 3 ares 30 centiares<br/>PEB N° 20161020028100: classe E<br/>Faire offre à partir de 85.000,00 € . <br/>Offre actuelle : 85.000,00 €.<br/> <br/>",,6110,2,330,-1,85000,334,"Rue de Gozée",Montigny-le-Tilleul,3,-1,1,1,1,-1,431,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,2,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 85000 €","S'adresser en l'étude.",0,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,,201610261444,201611080845,contact#notairescharleroi.be,notaire.france#skynet.be,,20161020028100,,,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,,,5,Bon,4,"Central gaz",1,Présente,"[""WEBB-AF4H3P""]",238 25383,CH-82753-16,0,50.3439488,4.4577754,3,18,1,,,,,"Terrain de 9 ares 58ca.<br/>Lot sous teinte blanche.",,6120,0,958,-1,85000,,"Rue de la Ferrée",Nalinnes,0,-1,0,0,-1,-1,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 85000 €","Sur place.",-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,,201612021139,201612021141,contact#notairescharleroi.be,notaire.france#skynet.be,,,,,HA,,,,,OFF,,3,Terrains,"un terrain",18,"Prairies / pâtures",Weide,3,1,Gré-à-Gré,,,,,,,,,"[""WEBB-AG9EJM"",""WEBB-AG9EJP""]",238 18716,CH-81190-16,0,50.4239506,4.4872409,1,7,1,,5,2,,"Maison avec jardin.<br/>Sous-sol: cave avec voussettes.<br/>Rez: hall, séjour-sàm, WC.<br/>Annexe: cuisine, sdb.<br/>1er étage: hall, 3 chambres.<br/>Annexe au 1er étage: 1 chambre, WC, pièce.<br/>Grenier aménageable.<br/>Jardin à l'arrière. Châssis DV en partie et volets en partie.<br/>",,6060,4,220,-1,80000,11,"Rue de la Station",Gilly,0,-1,1,0,1,-1,773,-1,-1,2,-1,-1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 80000 €","S'adresser en l'étude.",-1,-1,-1,1,1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe G",201602050944,201608081422,contact#notairescharleroi.be,notaire.france#skynet.be,G,20160128025502,528,,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,,,,,5,"Central mazout",2,"Non équipée","[""WEBB-A6UCCX"",""WEBB-A6UCCY"",""WEBB-A6UCD2""]",238 25159,CH-82686-16,0,50.4253111,4.501545,1,7,1,,,2,,"Maison 3 façades avec jardin.<br/>Sous-sol: caves.<br/>Rez: séjour, sàm avec coin cuisine, WC.<br/>1er étage: hall, 2 chambres.<br/>Grenier aménageable. Jardin.<br/>chauffage au charbon.<br/>Châssis DV PVC sauf un en façade.",,6060,2,350,-1,60000,47,"Rue de la Plateure",Gilly,3,-1,1,0,1,-1,297,-1,-1,1,-1,-1,1,-1,1,1,-1,-1,-1,0,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 60000 €","S'adresser en l'étude.",-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe G",201611221617,201611221625,contact#notairescharleroi.be,notaire.france#skynet.be,,201604280334591,,,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,,,,,,,2,"Non équipée","[""WEBB-AFXL43"",""WEBB-AFXL4H""]",238 24585,CH-82540-16,0,50.422774,4.4799037,2,12,1,,4,4,,"Appartement (2ème étage) comprenant hall, séjour, cuisine (frigo, four électrique et hotte), sdb avec douche multi confort, chambre.<br/>Balcon arrière, cave.",,6060,1,0,-1,55000,5,"Chaussée de Lodelinsart",Gilly,0,1,0,0,-1,-1,706,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 55000 €","S'adresser en l'étude.",-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe F",201610251409,201610251416,contact#notairescharleroi.be,notaire.france#skynet.be,,20161017025827,,,HA,,,,,OFF,,2,Appartements,"un appartement",12,Appartement,Appartement,2,1,Gré-à-Gré,,,,,4,"Central gaz",4,Equipée,"[""WEBB-AF3GDJ"",""WEBB-AF3GDL""]",238 22272,CH-82012-16,0,50.40205,4.5199634,1,7,1,,3,2,,"Maison avec dépendances et garage.<br/>Rez (+/- 50 m²): hall, cuisine, 1 pièce.<br/>1er étage (+/- 65 m²): hall, 4 chambres.<br/>2ème étage (+/- 60 m²): hall, sdb, 3 chambres.<br/>Grenier (+/- 45 m²) aménageable.<br/>Chauffage central, terrasse, jardin.<br/>RC du n°72: 535€ - RC du n°74: 97€.",,6200,7,228,-1,80000,72/74,"Rue d'Acoz",Châtelet,0,1,1,1,1,-1,632,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 80000 €","S'adresser en l'étude.",-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,"Classe G",201606291112,201606291117,contact#notairescharleroi.be,notaire.france#skynet.be,,20160120016969,,,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,,,,,3,Central,2,"Non équipée","[""WEBB-ABDCWC"",""WEBB-ABDCWJ""]",238 22955,CH-82160-16,0,50.1681918,4.3181224,1,2,1,,9,4,5,"Châlet de 65m² meublé avec jardin comprenant :<br/> <br/>Living, cuisine, 2 chambres, salle de bains <br/>Jardin avec deux chalets <br/>Convecteurs pétrole avec thermostat<br/>Boiler au gaz <br/>PEB : F<br/>",,6440,2,280,-1,50000,314,"Parc Résidentiel Le Bosquet",Fourbechies,4,-1,1,0,-1,1,265,-1,-1,1,-1,-1,-1,1,-1,-1,-1,-1,-1,1,-1,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 50000 €","S'adresser en l'étude.",2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,,,,,,,,,,,,,201608081032,201608081036,contact#notairescharleroi.be,notaire.france#skynet.be,,20160707022876,,,HA,,,,,OFF,,1,Maisons,"une maison",2,Châlet,Chalet,1,1,Gré-à-Gré,,,5,Bon,9,"Foyer gaz",4,Equipée,"[""WEBB-ACMC4J"",""WEBB-ACMC4S"",""WEBB-ACMC4X""]",238 25119,CH-82675-16,0,50.4328324,4.467517,1,7,1,4,2,,3,"Maison incendiée 3 façades avec jardin composée de :<br/>Sous-sol : caves.<br/>Rez-de-chaussée : + 43m²<br/>1er étage: + 43m²<br/>Grenier aménageable<br/>Jardin <br/>Offres à partir de 60.000,00€<br/>Offre actuelle : 75.000,00 €<br/><br/><br/> <br/> <br/><br/>",,6060,1,367,-1,60000,111,"Rue Chausteur",Gilly,3,-1,1,0,1,0,609,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,-1,-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,0,"FRANCE, Gilles","Maison du notariat de Charleroi",071/41.45.34,071/20.56.56,"Faire offre à partir de: 60000 €","S'adresser en l'étude.",0,-1,0,-1,-1,-1,-1,-1,-1,-1,0,,,,,,,,,,,,,201611210950,201612051553,contact#notairescharleroi.be,notaire.france#skynet.be,,,,,HA,,,,,OFF,,1,Maisons,"une maison",7,"Maison d'habitation",Woonhuis,1,1,Gré-à-Gré,4,Oui,3,Mauvais,2,"A installer",,,"[""WEBB-AFWCFT""]",238 Or if you only want specific fields from the json $json_string = "http://v2.notmaison.be/php/index.php?action=getRealEstateByNotaris¬aris=FRANCE,%20Gilles"; $jsondata = file_get_contents($json_string); $json_obj = json_decode ($jsondata); $csv_file = fopen('php://output', 'w'); foreach ( $json_obj->results as $result) { // to use only specific fields from the input fputcsv($csv_file, array($result->re_nu, $result->re_ru) ); } Giving a csv like this 10,"Rue Basslé" 114,"Rue Hanoteau" 31,"Rue Brasserie Gillieaux" 198,"Chaussée de Lodelinsart" 334,"Rue de Gozée" ,"Rue de la Ferrée" 11,"Rue de la Station" 47,"Rue de la Plateure" 5,"Chaussée de Lodelinsart" 72/74,"Rue d'Acoz" 314,"Parc Résidentiel Le Bosquet" 111,"Rue Chausteur" EDIT for second question If you want the Images codes included in your output then this would do it foreach ( $json_obj->results as $result) { $required = array(); // init an array // pick fields wanted in resulting csv $required[] = $result->re_nu; $required[] = $result->re_ru; // get the images $im_codes = json_decode($result->im); foreach ($im_codes as $im) { $required[] = 'http://photos.notmaison.be/photos/m' . $im . '.jpg'; } fputcsv($csv_file, $required); } Generated output: 10,"Rue Basslé",http://photos.notmaison.be/photos/mWEBB-AFYESF.jpg,http://photos.notmaison.be/photos/mWEBB-AFYES7.jpg,http://photos.notmaison.be/photos/mWEBB-AFYES9.jpg 114,"Rue Hanoteau",http://photos.notmaison.be/photos/mWEBB-ABZGY2.jpg,http://photos.notmaison.be/photos/mWEBB-ABZGY5.jpg 31,"Rue Brasserie Gillieaux",http://photos.notmaison.be/photos/mWEBB-9ZXJLP.jpg,http://photos.notmaison.be/photos/mWEBB-9ZXJLS.jpg,http://photos.notmaison.be/photos/mWEBB-9ZXJMS.jpg 198,"Chaussée de Lodelinsart",http://photos.notmaison.be/photos/mWEBB-AELG3S.jpg,http://photos.notmaison.be/photos/mWEBB-AEVHX6.jpg,http://photos.notmaison.be/photos/mWEBB-AEVHX8.jpg,http://photos.notmaison.be/photos/mWEBB-AEVHXA.jpg,http://photos.notmaison.be/photos/mWEBB-AEVHXC.jpg,http://photos.notmaison.be/photos/mWEBB-AEVHXE.jpg 334,"Rue de Gozée",http://photos.notmaison.be/photos/mWEBB-AF4H3P.jpg ,"Rue de la Ferrée",http://photos.notmaison.be/photos/mWEBB-AG9EJM.jpg,http://photos.notmaison.be/photos/mWEBB-AG9EJP.jpg 11,"Rue de la Station",http://photos.notmaison.be/photos/mWEBB-A6UCCX.jpg,http://photos.notmaison.be/photos/mWEBB-A6UCCY.jpg,http://photos.notmaison.be/photos/mWEBB-A6UCD2.jpg 47,"Rue de la Plateure",http://photos.notmaison.be/photos/mWEBB-AFXL43.jpg,http://photos.notmaison.be/photos/mWEBB-AFXL4H.jpg 5,"Chaussée de Lodelinsart",http://photos.notmaison.be/photos/mWEBB-AF3GDJ.jpg,http://photos.notmaison.be/photos/mWEBB-AF3GDL.jpg 72/74,"Rue d'Acoz",http://photos.notmaison.be/photos/mWEBB-ABDCWC.jpg,http://photos.notmaison.be/photos/mWEBB-ABDCWJ.jpg 314,"Parc Résidentiel Le Bosquet",http://photos.notmaison.be/photos/mWEBB-ACMC4J.jpg,http://photos.notmaison.be/photos/mWEBB-ACMC4S.jpg,http://photos.notmaison.be/photos/mWEBB-ACMC4X.jpg 111,"Rue Chausteur",http://photos.notmaison.be/photos/mWEBB-AFWCFT.jpg
I need to output in the same time [""WEBB-AFYESF"",""WEBB-AFYES7"",""WEBB-AFYES9""] to CSV as "http://photos.notmaison.be/photos/mWEBB-AFYESF.jpg", "http://photos.notmaison.be/photos/mWEBB-AFYES7.jpg", "http://photos.notmaison.be/photos/mWEBB-AFYES9.jpg"
automatic form submission with CURL php
I can not run this script, I have every time two error messages can you help me (!) Warning: DOMDocument :: loadHTML (): Empty string Supplied as input in C: \ wamp \ www \ form \ formulaire.php on line 23 0.1442 2 142344 loadHTML () .. \ formulaire.php: 23 Notice (!): Undefined variable: description in C: \ wamp \ www \ form \ formulaire.php on line 57 <?php //La page qu'on veut utiliser $wikipediaURL = 'http://fr.wikipedia.org/wiki/Megadeth'; //On initialise cURL $ch = curl_init(); //On lui transmet la variable qui contient l'URL curl_setopt($ch, CURLOPT_URL, $wikipediaURL); //On lui demdande de nous retourner la page curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //On envoie un user-agent pour ne pas être considéré comme un bot malicieux curl_setopt($ch, CURLOPT_USERAGENT, 'Le blog de Samy Dindane (www.dinduks.com'); //On exécute notre requête et met le résultat dans une variable $resultat = curl_exec($ch); //On ferme la connexion cURL curl_close($ch); //On crée un nouveau document DOMDocument $wikipediaPage = new DOMDocument(); //On y charge le contenu qu'on a récupéré avec cURL $wikipediaPage->loadHTML($resultat); //On parcourt les balises <div> foreach($wikipediaPage->getElementsByTagName('div') as $div){ //Si l'id de la page est bodyContent if($div->getAttribute('id') == "bodyContent"){ //On met le contenu du premier <p> dans une variable $premierP = trim($div->getElementsByTagName('p')->item(0)->nodeValue); //Si le premier <p> est vide ou ne contient pas du texte while($premierP == '<br>' || $premierP == '<br />' || $premierP == ''){ //On le supprime $div->removeChild($div->getElementsByTagName('p')->item(0)); //Et on passe au <p> suivant $premierP = trim($div->getElementsByTagName('p')->item(0)->nodeValue); }; //Un joli try pour éviter les messages d'erreur try{ //On parcourt toutes les tables foreach( $div->getElementsByTagName('table') as $table ){ //Et on les supprime $div->removeChild($table); } } catch(Exception $e){ //On censure :P } //On récupère le contenu de la fameuse balise <p> dans une variable $description = '<p>' . $div->getElementsByTagName('p')->item(0)->nodeValue. '</p>'; } } //On enlève la syntaxe propre à Wikipedia $description = preg_replace('/\[[0-9]*\][,]|\[[0-9]*\]/', '', $description); //On affiche de résultat echo $description; ?> Hello I tackled too big so I gave up Thanks for your help
Check out Simple Html Dom. It really simplifies finding stuff in html files. Here is an example with your code. <?php include("simple_html_dom.php"); $wikipediaURL = 'http://fr.wikipedia.org/wiki/Megadeth'; $html = file_get_html($wikipediaURL); $description = '<p>' .$html->find('p', 0). '</p>'; $description = preg_replace('/\[[0-9]*\][,]|\[[0-9]*\]/', '', $description); echo $description; Simple Html Dom Documentation
Try this $resultat = file_get_contents('http://fr.wikipedia.org/wiki/Megadeth');
Php mysql script returns Null insead of a "long" value
I have a simple PHP script : function test() { $sql = "select author, synopsis from book"; $result = mysql_query($sql); // result set while ($rec = mysql_fetch_array($result, MYSQL_ASSOC)) { $arr[] = $rec; }; $data = json_encode($arr); //encode the data in json format echo $data; } The problem is that when I try to read the result with jQuery, I get ‘"synopsis" : NULL‘. I'm wondering is it because the value of synopsis in the database contains multiple lines? jQuery code : <script> $(document).ready(function() { $.ajax({ url: "data/book.php", type: 'POST', dataType: 'json', success : function (data) { $('div.book').text(data[0].synopsis); } }); }); </script> The output of the php : [{"author":"author","synopsis":null}] Responde to #iMx suggestion : array(2) { [0]=> array(2) { ["author"]=> string(7) "author" ["synopsis"]=> string(697) "Le patient du psychiatre Dekker, un certain Boone, avoue durant les transes dans lesquelles le plonge le docteur, qu'il aurait commis une dizaine de meurtres, tous plus sordides les uns que les autres. Seulement, une fois sortie de cet �tat d'exaltation, l'homme ne se rappelle de rien. D�sesp�r�, Boone fait une tentative de suicide rat�e qui le conduit � l'h�pital. Son compagnon de chambre, visiblement bien cram� du cerveau, �voque le nom de Midian, un endroit dans le d�sert de l'Athabasca o� se regroupent les damn�s de la terre, les �tres qui souffrent horriblement. Convaincu de pouvoir y trouver un r efuge, et ainsi de mettre un terme � ses crimes, il part sur ce lieu �trange..." } Maybe there is a problem because of the french characters?
I guess it is an encoding problem. What encoding do your mysql tables have? json_encode() accepts only UTF-8 strings and could return null on a non UTF-8 strings - maybe it is your problem. Try to convert the strings with iconv() or mb_convert_encoding() or to set your MySQL query encoding to UTF-8 with mysql_query('SET CHARACTER SET utf8') before your SELECT requests.
making payments through mercanet in PHP
In an e-commerce website for a company located in France we want to take payments through Mercanet (BNP Paribas). I downloaded API's for linux, it only contains two binary files (request, response) there are no PHP examples. No answer from helpdesk either. Also I downloaded the certificate for the website, but just stuck as there is no howto files.
TO anybody out there pulling their hair out with the ATOS / Mercanet / Sips payment system, below is an example of the PHP file they sent me. All their help docs is in french. It is important to note that there are 32 and 64 bit versions - you have to use correct one. I tried the tricks mentioned here https://translate.googleusercontent.com/translate_c?depth=1&hl=en&prev=search&rurl=translate.google.co.za&sl=fr&u=http://www.developpez.net/forums/d599959/webmasters-developpement-web/general-conception-web/e-commerce/probleme-d-installation-d-plug-in-mercanet/&usg=ALkJrhj4iJ0kxEE9EoUbQTjq_0peu4_PSQ FTP trick did not work. https://translate.googleusercontent.com/translate_c?depth=1&hl=en&prev=search&rurl=translate.google.co.za&sl=fr&u=http://www.developpez.net/forums/d1154720/webmasters-developpement-web/general-conception-web/e-commerce/probleme-d-installation-d-plug-in-mercanet/&usg=ALkJrhiEypDQCmEu5uVWD5uDpOChAAaNbQ 32bit hack did not work this give you pretty good instructions. translations looks good enough to make sense of it https://translate.googleusercontent.com/translate_c?depth=1&hl=en&prev=search&rurl=translate.google.co.za&sl=fr&u=http://thierry-godin.developpez.com/php/atos/&usg=ALkJrhjC12cJksMlauYxLvwnoxPV0G__9g the only thing that worked was having the correct version. also remember if you using git, a push may reset permissions, then you have to 755 the request file everytime you push. PHP example: print ("<HTML><HEAD><TITLE>MERCANET - Paiement Securise sur Internet</TITLE></HEAD>"); print ("<BODY bgcolor=#ffffff>"); print ("<Font color=#000000>"); print ("<center><H1>Test de l'API plug-in MERCANET</H1></center><br><br>"); // Affectation des paramètres obligatoires $parm="merchant_id=082584341411111"; $parm="$parm merchant_country=fr"; $parm="$parm amount=100"; $parm="$parm currency_code=978"; // Initialisation du chemin du fichier pathfile (à modifier) // ex : // -> Windows : $parm="$parm pathfile=c:/repertoire/pathfile"; // -> Unix : $parm="$parm pathfile=/home/repertoire/pathfile"; $parm="$parm pathfile=" . XOOPS_ROOT_PATH.'/tray_code/payment_gateways/sips/param/pathfile'; // Si aucun transaction_id n'est affecté, request en génère // un automatiquement à partir de heure/minutes/secondes // Référez vous au Guide du Programmeur pour // les réserves émises sur cette fonctionnalité // // $parm="$parm transaction_id=123456"; // Affectation dynamique des autres paramètres // Les valeurs proposées ne sont que des exemples // Les champs et leur utilisation sont expliqués dans le Dictionnaire des données // // $parm="$parm normal_return_url=http://www.maboutique.fr/cgi-bin/call_response.php"; // $parm="$parm cancel_return_url=http://www.maboutique.fr/cgi-bin/call_response.php"; // $parm="$parm automatic_response_url=http://www.maboutique.fr/cgi-bin/call_autoresponse.php"; // $parm="$parm language=fr"; // $parm="$parm payment_means=CB,2,VISA,2,MASTERCARD,2"; // $parm="$parm header_flag=no"; // $parm="$parm capture_day="; // $parm="$parm capture_mode="; // $parm="$parm bgcolor="; // $parm="$parm block_align="; // $parm="$parm block_order="; // $parm="$parm textcolor="; // $parm="$parm receipt_complement="; // $parm="$parm caddie=mon_caddie"; // $parm="$parm customer_id="; // $parm="$parm customer_email="; // $parm="$parm customer_ip_address="; // $parm="$parm data="; // $parm="$parm return_context="; // $parm="$parm target="; // $parm="$parm order_id="; // Les valeurs suivantes ne sont utilisables qu'en pré-production // Elles nécessitent l'installation de vos fichiers sur le serveur de paiement // // $parm="$parm normal_return_logo="; // $parm="$parm cancel_return_logo="; // $parm="$parm submit_logo="; // $parm="$parm logo_id="; // $parm="$parm logo_id2="; // $parm="$parm advert="; // $parm="$parm background_id="; // $parm="$parm templatefile="; // insertion de la commande en base de données (optionnel) // A développer en fonction de votre système d'information // Initialisation du chemin de l'executable request (à modifier) // ex : // -> Windows : $path_bin = "c:/repertoire/bin/request"; // -> Unix : $path_bin = "/home/repertoire/bin/request"; // $path_bin = XOOPS_ROOT_PATH.'/tray_code/payment_gateways/sips/bin/static/request'; // Appel du binaire request // La fonction escapeshellcmd() est incompatible avec certaines options avancées // comme le paiement en plusieurs fois qui nécessite des caractères spéciaux // dans le paramètre data de la requête de paiement. // Dans ce cas particulier, il est préférable d.exécuter la fonction escapeshellcmd() // sur chacun des paramètres que l.on veut passer à l.exécutable sauf sur le paramètre data. $parm = escapeshellcmd($parm); $result=exec("$path_bin $parm"); // sortie de la fonction : $result=!code!error!buffer! // - code=0 : la fonction génère une page html contenue dans la variable buffer // - code=-1 : La fonction retourne un message d'erreur dans la variable error //On separe les differents champs et on les met dans une variable tableau $tableau = explode ("!", "$result"); // récupération des paramètres $code = $tableau[1]; $error = $tableau[2]; $message = $tableau[3]; // analyse du code retour if (( $code == "" ) && ( $error == "" ) ) { print ("<BR><CENTER>erreur appel request</CENTER><BR>"); print ("executable request non trouve $path_bin"); } // Erreur, affiche le message d'erreur else if ($code != 0){ print ("<center><b><h2>Erreur appel API de paiement.</h2></center></b>"); print ("<br><br><br>"); print (" message erreur : $error <br>"); } // OK, affiche le formulaire HTML else { print ("<br><br>"); # OK, affichage du mode DEBUG si activé print (" $error <br>"); print (" $message <br>"); } print ("</BODY></HTML>");