首页  >  问答  >  正文

创建一个包含大量txt文件的csv文件

我正在尝试读取大量 txt 文件并将第一行保存为标题,将其余文本保存为内容,然后导出到 CSV 文件。

我为 CSV 创建一个通过迭代增加的 id,但是当我遇到迭代中看不到的错误时,因为当它保存数组中的内容时,会将最后一个内容添加到该值。

我需要创建一个 CSV,其中包含 3 个“列”,分别命名为 id、titulo 和 contenido,并按每个文件将信息保存在数组中。一个 txt 文件,一次数组迭代。

抱歉我的英语不好。

这是我的代码:

<?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;

要读取的文件示例。

文件1.txt

Titulo 1
texto 1

文件2.txt

Titulo 2
texto 2

CSV

id, titulo, contenido, 0, Titulo 1, texto 1, 1, Titulo 2, texto 2

非常感谢各位朋友。

P粉287254588P粉287254588260 天前397

全部回复(2)我来回复

  • P粉198670603

    P粉1986706032024-02-27 11:15:53

    我使用这个形式是因为我可以更好地格式化我的答案。

    我需要文件的全部内容减去第一行都在 $contenido 列中。

    现在,使用您的代码可以正常工作,但如果同一文件在内容后有多于一行,它将使用每一行作为结果的新行。

    例如我现在使用这个文件

    文件1.txt

    Titulo 1
    texto 1,texto 1
    
    Some more text in file 1

    文件2.txt

    Titulo 2
    texto 2, texto 2, texto 2, texto 2, texto 2, texto 2
    
    Some text 2 of the same archive

    这会生成这个 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"

    但我需要这个:

    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"

    内容保存 txt 文件中的所有空格和 \n 非常重要,因为该 txt 文件是博客的帖子。

    一个文件.txt 的示例

    ¿Como puedo comer galletas?<-- Title
    
    Las galletas se comen con la boca, poco a poco masticando.
    
    

    ¿Cuántos sabores de galletas hay?

    Pues hay de todos los que puedas imaginar.

    标题后的所有文本都必须保持在同一行,以保存 \n 和所有内容。

    一个文件在 CSV 中只有一行。

    非常感谢你,我对我的英语感到抱歉。

    回复
    0
  • P粉548512637

    P粉5485126372024-02-27 11:12:31

    第 19 行的 $contenido 未定义,它试图将一个不存在的变量与 .= 连接起来。 $contenido 变量也不是必需的,因为每个存档行都在 $datosparacsv 中定义。

    也无需定义 $delimitador$enclosure,因为定义的值也是默认值。

    这是正确的 PHP 代码,其中包含预期的 CSV 输出以及解释每个修改行的注释。

    它还根据需要保留内容中的新行和空格。

    文件/1.txt

    Titulo 1
    texto 1

    文件/2.txt

    Titulo 2
    texto 2
    
    texto3
    
    
    
    texto4

    这将使用此数据保存 entradas.csv。

    ID,titulo,contenido
    0,"Titulo 1","texto 1"
    1,"Titulo 2","texto 2
    
    texto3
    
    
    
    texto4"

    回复
    0
  • 取消回复