首頁  >  問答  >  主體

建立一個包含大量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粉287254588210 天前328

全部回覆(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
  • 取消回覆