Экспорт данных из базы данных SQL в файл CSV, некоторые строки данных разбиты на несколько строк - PullRequest
0 голосов
/ 08 мая 2018

Когда я экспортирую данные из своей базы данных SQL в файл CSV, некоторые строки данных (записей) разбиваются на более чем одну строку, как будто существует CR. Я знаю, что одна из причин заключается в следующем: один из столбцов данных - «Примечания», который содержит текст, который иногда содержит CR; Я понимаю, почему это вызывает новую строку в CSV, но я бы тоже этого не хотел. Как я могу удалить CR, но добавить точку + пробел для форматирования заметки, чтобы она читалась даже без CR?

Однако я также получаю дополнительную строку, даже если нет CR, то есть CSV имеет пустую строку после записи, или примечание находится на дополнительной строке. Я включил скриншот части файла CSV, чтобы проиллюстрировать это, а также показать, что не все записи показывают поведение. messed up CVS file showing some rows split and some not

Вот мой код. Я не писал это, я унаследовал это. Кроме того, я не очень опытный в написании кода.

header('Content-Type: application/msexcel-tab');
header('Content-Disposition: attachment; filename="Invaders of Texas Data -- '.date("Y-m-d").'.xls"');

$whereclause = '';
$passclause = '';
$satellite = $_REQUEST['satellite'];
$collector = $_REQUEST['collector'];
$sn = $_REQUEST['sn'];
$cn = $_REQUEST['cn'];

if ($satellite){
    $whereclause .= " AND `satellite_id` = ".$satellite." ";
    $passclause .= "&satellite=".$satellite;
}
if ($collector){
    $whereclause .= " AND `collector_id` = ".$collector." ";
    $passclause .= "&collector=".$collector;    
}
if ($sn){
    $whereclause .= " AND `plant_id` LIKE '".$sn."' ";  
    $passclause .= "&sn=".$sn;
}
if ($cn){
    $whereclause .= " AND `plant_id` LIKE '".$cn."' ";  
    $passclause .= "&cn=".$cn;
}

$count_sql = "
    SELECT COUNT(*) AS `counttotal`
    FROM `inv_sites`
    WHERE 1
    $whereclause
    AND `valid` LIKE 'Yes'
    ;
";
//echo $count_sql;
$count_total = mysql_fetch_array(mysql_query($count_sql));


$sql = "
    SELECT *
    FROM `inv_sites`
    WHERE 1
    $whereclause 
    AND `valid` LIKE 'Yes'
    ORDER BY `collection_date` ASC
    ;
";
$the_result = mysql_query($sql);
?>

Invaders of Texas
www.texasinvasives.org
Exported: <?= date("Y-m-d G:i"); ?> 

Obs_ID  Date    USDA    Species Time_Spent  Satellite   Collector   Lat Long    Location_Error  Loc_Err_Units    Disturbance    Patch_Type  Abundance   Validated   Valid_Name  Valid_Date  Notes

<?php
if ($this_row = mysql_fetch_array($the_result)){
    do {
?>
<?=$this_row['site_id'];?>  <?=$this_row['collection_date'];?>  <?=$this_row['plant_id']?>  <?=sn_from_usda($this_row['plant_id'])?>    <?=$this_row['collection_time'];?>  <?=satellite_from_id($this_row['satellite_id']);?>  <?=$this_row['collector_id'];?> <?=$this_row['latitude'];?> <?=$this_row['longitude'];?>    <?=$this_row['error'];?>    <?=$this_row['error_unit'];?>   <?=$this_row['disturbance'];?>  <?=$this_row['patch_type'];?>   <?=$this_row['abundance'];?>    <?=$this_row['valid'];?>    <?=$this_row['valid_name'];?>   <?=$this_row['valid_date'];?>   <?=$this_row['notes'];?>

<?php
    } while ($this_row = mysql_fetch_array($the_result));
}
?>

Буду признателен за любую помощь !! Спасибо.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете заменить символы новой строки в PHP или запросе SQL.

У вас есть следующая строка выше.

<?=$this_row['site_id'];?>  <?=$this_row['collection_date'];?>  <?=$this_row['plant_id']?>  <?=sn_from_usda($this_row['plant_id'])?>    <?=$this_row['collection_time'];?>  <?=satellite_from_id($this_row['satellite_id']);?>  <?=$this_row['collector_id'];?> <?=$this_row['latitude'];?> <?=$this_row['longitude'];?>    <?=$this_row['error'];?>    <?=$this_row['error_unit'];?>   <?=$this_row['disturbance'];?>  <?=$this_row['patch_type'];?>   <?=$this_row['abundance'];?>    <?=$this_row['valid'];?>    <?=$this_row['valid_name'];?>   <?=$this_row['valid_date'];?>   <?=$this_row['notes'];?>

Попробуйте заменить его на приведенное ниже (изменение в самом конце).

<?=$this_row['site_id'];?>  <?=$this_row['collection_date'];?>  <?=$this_row['plant_id']?>  <?=sn_from_usda($this_row['plant_id'])?>    <?=$this_row['collection_time'];?>  <?=satellite_from_id($this_row['satellite_id']);?>  <?=$this_row['collector_id'];?> <?=$this_row['latitude'];?> <?=$this_row['longitude'];?>    <?=$this_row['error'];?>    <?=$this_row['error_unit'];?>   <?=$this_row['disturbance'];?>  <?=$this_row['patch_type'];?>   <?=$this_row['abundance'];?>   <?=$this_row['valid'];?>    <?=$this_row['valid_name'];?>   <?=$this_row['valid_date'];?>   <?=trim(preg_replace('/\s+/', ' ', $this_row['notes']));?>

preg_replace позволяет использовать регулярные выражения в php для удаления новых строк.

Если это не сработает, вам может понадобиться изменить ваш SQL-запрос, чтобы удалить символ новой строки из запроса к базе данных. Посмотреть это сообщение

Пит

...