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.
From the database I receive the following text:
<div onclick="alert('código inyectado');">Texto</div>
[img]http://www.hobbyconsolas.com/sites/hobbyconsolas.com/public/media/image/2015/07/503196-halo-5-guardians-nuevos-datos-campana-cooperativa.jpg[/img]
Y aquà una URL: [url]https://www.google.es/?gws_rd=ssl[/url]
Bueno pues vamos [b]a ver si esto funciona[/b] porque "todavÃa" no lo sé [i][u]bien[/u][/i]
This text is stored in a variable called $texto. Once htmlspecialchars() applied to the variable, I go through where I´m finding the problem:
$texto = str_replace(""","\"",$texto); //para comillas
$texto = str_replace("<","<",$texto); // para <
$texto = str_replace(">",">",$texto); // para >
But no modification is done. If I remove the character & works, how can I fix this problem?
I'd say don't do that htmlspecialchars() call, and only call str_replace() once:
Code: (Demo)
$texto="<div onclick="alert('código inyectado');">Texto</div>
[img]http://www.hobbyconsolas.com/sites/hobbyconsolas.com/public/media/image/2015/07/503196-halo-5-guardians-nuevos-datos-campana-cooperativa.jpg[/img]
Y aquà una URL: [url]https://www.google.es/?gws_rd=ssl[/url]
Bueno pues vamos [b]a ver si esto funciona[/b] porque "todavÃa" no lo sé [i][u]bien[/u][/i]";
//$texto=htmlspecialchars($texto);
$texto = str_replace([""","<",">"],['"','<','>'],$texto);
var_export($texto);
Output:
'<div onclick="alert(\'código inyectado\');">Texto</div>
[img]http://www.hobbyconsolas.com/sites/hobbyconsolas.com/public/media/image/2015/07/503196-halo-5-guardians-nuevos-datos-campana-cooperativa.jpg[/img]
Y aquà una URL: [url]https://www.google.es/?gws_rd=ssl[/url]
Bueno pues vamos [b]a ver si esto funciona[/b] porque "todavÃa" no lo sé [i][u]bien[/u][/i]'
fyrye's suggestion yields this -- if this is what you are shooting for:
'<div onclick="alert('código inyectado');">Texto</div>
[img]http://www.hobbyconsolas.com/sites/hobbyconsolas.com/public/media/image/2015/07/503196-halo-5-guardians-nuevos-datos-campana-cooperativa.jpg[/img]
Y aquà una URL: [url]https://www.google.es/?gws_rd=ssl[/url]
Bueno pues vamos [b]a ver si esto funciona[/b] porque "todavÃa" no lo sé [i][u]bien[/u][/i]'
It sounds like you're double encoding. To avoid the double encoding you can use.
htmlspecialchars($texto, ENT_QUOTES, 'UTF-8', false);
See: http://php.net/manual/en/function.htmlspecialchars.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');
Im trying to call some php code that I found in order to execute some java code to run a php jru jasper report.
Here is the code I want to run with Symfony
<?php
function DescargarArchivo($fichero)
{
$basefichero = basename($fichero);
header( "Content-Type: application/octet-stream");
header( "Content-Length: ".filesize($fichero));
header( "Content-Disposition:attachment;filename=" .$basefichero."");
readfile($fichero);
}
//Obtener Fecha de Hoy
$fecha = time ();
$fecha_partir1=date ( "h" , $fecha ) ;
$fecha_partir2=date ( "i" , $fecha ) ;
$fecha_partir4=date ( "s" , $fecha ) ;
$fecha_partir3=$fecha_partir1-1;
$reporte="Reporte_";
$filename = $reporte. date("Y-m-d")."_". $fecha_partir3.'_'.$fecha_partir2.'_'.$fecha_partir4.'.pdf';
//Llamando las librerias
require_once('http://localhost:8080/JavaBridge/java/Java.inc');
require('./php-jru/php-jru.php');
//Llamando la funcion JRU de la libreria php-jru
//$jru=new JRU();
$jru=new PJRU();
//Ruta del reporte compilado Jasper generado por IReports
//$Reporte='C://xampp//htdocs//reportes_javabridge//reportes//report1.jasper';
$Reporte='C://Dropbox//Apache Xampp//evaluacion_daci//web//reportes_javabridge//reportes//control_pago_estado_de_cuenta.jasper';
//Ruta a donde deseo Guardar Mi archivo de salida Pdf
//$SalidaReporte='C://xampp//htdocs//reportes_javabridge//'.$filename;
$SalidaReporte='C://Dropbox//Apache Xampp//evaluacion_daci//web//reportes_javabridge//'.$filename;
//Parametro en caso de que el reporte no este parametrizado
$Parametro=new java('java.util.HashMap');
$Parametro->put("id", 39);
//Funcion de Conexion a mi Base de datos tipo MySql
//$Conexion= new JdbcConnection("com.mysql.jdbc.Driver","jdbc:mysql://localhost/probando_reportesphp","root","clave");
$Conexion= new JdbcConnection("com.mysql.jdbc.Driver","jdbc:mysql://localhost/evaluaciones?zeroDateTimeBehavior=convertToNull","root","admin");
//Generamos la Exportacion del reporte
$jru->runReportToPdfFile($Reporte,$SalidaReporte,$Parametro,$Conexion->getConnection());
if(file_exists($SalidaReporte))
{
DescargarArchivo($filename);
if(file_exists($SalidaReporte))
{
if(unlink($filename))
{
}
}
}
?>
My problem here is that require_once is installed in other server and dont know how to call this from the controller
Having this array:
$arr['id']=150;
$arr['contenido']="un proyecto";
$arr['foto']="una foto";
This works very good
$text = 'estamos en el registro {id} cuyo contenido es {contenido} por lo que veremos su {foto}';
$text = preg_replace('/{(.*?)}/', '$1', $text);
echo $text;
//print:
//estamos en el registro id cuyo contenido es contenido por lo que veremos su foto
I understand that $1 y the value enclosed by { and } but I need replace with the value of array that match with the key. I trying this
$text2 ='estamos en el registro {id} cuyo contenido es {contenido} por lo que veremos su {foto}';
$text2 = preg_replace('/{(.*?)}/', $arr['$1'], $text2);
echo $text2;
//print
estamos en el registro cuyo contenido es por lo que veremos su
but this no print anythig in the pos of {key}, how I get impresed the array value referenced by the key y n {}.
preg_replace_callback(
'/{(.*?)}/',
function (array $m) use ($arr) { return $arr[$m[1]]; },
$text2
)