I created a code in php that performs a search on twitter and saves the result (100 tweets ) in a database . In this code , I also have the option to select all database tweets and exports them to a csv file.
However, if the tweet has a line break he'll be that way in csv :
What do I do to save this tweet on one line of the csv ( delete line break )
This is my code that exports tweets to csv :
// Database Connection
$host="xxxxxx";
$uname="xxxxx";
$pass="xxxxxx";
$database = "xxxxxx";
$connection=mysql_connect($host,$uname,$pass);
echo mysql_error();
//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or die("Database could not be selected");
$result=mysql_select_db($database)
or die("database cannot be selected <br>");
// Fetch Record from Database
$output = "";
$table = "tabela_tweets_novo"; // Enter Your Table Name
$sql = mysql_query("select tweet from $table");
$columns_total = mysql_num_fields($sql);
// Get The Field Name
for ($i = 0; $i < $columns_total; $i++) {
$heading = mysql_field_name($sql, $i);
$output .= '"'.$heading.'",';
}
$output .="\n";
// Get Records from the table
while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$acentua = utf8_decode($row["$i"]);
$output .='"'.$acentua.'",';
}
$output .="\n";
}
// Download the file
$filename = "UUXPost.csv";
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);
echo $output;
exit;
Insert the 3 Line in your Code and change the replace string to what you want
$acentua = utf8_decode($row["$i"]); <- your code
$order = array("\r\n", "\n", "\r");
$replace = '<br />';
$acentua = str_replace($order, $replace, $acentua);
$output .='"'.$acentua.'",'; <- your code
You should use PHP's built-in csv methods that'll handle escaping for you (you'll have to escape fields with linebreaks).
Sadly I'm on my mobile right now so it's quite a pita to add the urls. I'll do that later (or some editor).
Search the PHP manual for fputcsv().
Related
Actually I want to display data in csv format on a web page . Data is stored in message field in the database.
The data is :
data count
120 80
140 50
170 100
150 70
180 120
I want to display this data on a webpage in csv format separated by comma like: data , count .
I found this code on some other site but rather than displaying data on a webpage it make the csv file in folder and store the data in it .
here is the code:
// open connection to mysql database
$connection = mysqli_connect($host, $username, $password, $dbname) or
die("Connection Error " . mysqli_error($connection));
// fetch mysql table rows
$sql = "select message from wholesaler";
$result = mysqli_query($connection, $sql) or die("Selection Error " . mysqli_error($connection));
$fp = fopen('books.csv', 'w');
while($row = mysqli_fetch_assoc($result)) {
fputcsv($fp, $row);
}
fclose($fp);
//close the db connection
mysqli_close($connection);
Can anyone tell me the steps to resolve it ?
Code you provided use the loop to save data into CSV file. Because you don't need to save it in a file then you have to replace this loop with some code printing rows on your output.
According to your code you need to replace this part
$fp = fopen('books.csv', 'w');
while($row = mysqli_fetch_assoc($result))
{
fputcsv($fp, $row);
}
with for example this
while($row = mysqli_fetch_assoc($result)) {
//we need to split your message into array
$csvRows = explode("\n", $row['message']);
$head = [];
if (array_key_exists(0, $csvRows)) {
$head = explode(' ', trim($csvRows[0]));
}
$data = [];
for ($i = 1; $i < count($csvRows); $i++) {
$data[] = explode(' ', trim($csvRows[$i]));
}
//print recognized headers
echo '<table width="100%"><tr>';
foreach ($head as $h) {
echo "<th>{$h}</th>";
}
echo '</tr>';
//print your csv row as table row
foreach ($data as $r) {
echo '<tr>';
foreach ($r as $v) {
echo "<td>{$v}</td>";
}
echo '</tr>';
}
echo '<table>';
}
There are 2 blank rows at the top of csv when script is run...Have no idea why. This code works in another application I've made. I'm using the same code and same database??
Does the location in directory make a difference?
<?php
mysql_connect("", "", "")
or die(mysql_error());
mysql_select_db("dbname")
or die(mysql_error());
$database = "mydb";
//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or die("Database could not be selected");
$result=mysql_select_db($database)
or die("database cannot be selected <br>");
// Fetch Record from Database
$output = "";
// Store Matching
$sql = mysql_query("SELECT audiolist.`Store Number`, audiolist.Address, audiolist.City, audiolist.State, audiolist.`Zip Code`, audiolist.`Install Date`
FROM audiolist INNER JOIN filteredlist ON audiolist.`Store Number`=filteredlist.`Store Number`");
$columns_total = mysql_num_fields($sql);
// Get The Field Name
for ($i = 0; $i < $columns_total; $i++) {
$heading = mysql_field_name($sql, $i);
$output .= '"'.$heading.'",';
}
$output .="\n";
// Get Records from the table
while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$output .='"'.$row["$i"].'",';
}
$output .="\n";
}
// Download the file
$filename = "myfilename" . date("Y-m-d") . ".csv";
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);
echo $output;
exit;
Not exactly sure why it matters...but apparently if there are any lines before the initial <?php tag, those lines show up as plank rows when the csv is generated. There were two lines before mine and therefore 2 blank rows...It works now!
After this line of your code:
header('Content-Disposition: attachment; filename='.$filename);
Add this code:
ob_clean(); // discard any data in the output buffer (if possible)
flush();
First let me introduce myself:
Im 33. 'Living in the Netherlands and i'm a newbe if it comes to php :)
I have a csv file on my vps httpdocs\data\1day.csv . In this file there are two columns: datetime and value. The file looks like this:
"datetime","value",
"2016-01-02 10:50:01","1060.9",
"2016-01-02 10:45:01","1060.6",
I want to make a simple calculation to the file 1day.csv and save it to another csv file. Let's say the caluclation will be value * 5:
"datetime","value","value2",
"2016-01-02 10:50:01","1060.9","5304.5",
"2016-01-02 10:45:01","1060.9","5304.5",
The calculation needs to be done over the whole "value" column.
I want to do this with php and let a cronjob execute this script every x minutes.
Can anybody help me in the right direction?
I would maybe do it more simple. If you didn't know how many columns you could do the extra loops to get column names, but it does not look necessary.
$output = "datetime, value1, value2\n"; // Column names
while ($row = mysql_fetch_array($sql)) {
$output .='"' . $row[0] . '" ,';
$output .='"' . $row[1] . '" ,';
$output .='"' . ($row[1] * 5) . '"';
$output .="\n";
}
#riggsfolly
Ok. This is what i got so far:
// Database Connection
$host="localhost";
$uname="xxxxx";
$pass="xxxxx";
$database = "xxxxx";
$connection=mysql_connect($host,$uname,$pass);
echo mysql_error();
//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or
die("Database could not be selected");
$result=mysql_select_db($database)
or die("database cannot be selected <br>");
// Fetch Record from Database
$output = "";
$table = "quotes"; // Enter Your Table Name
$sql = mysql_query("select datetime, value from $table where type = '5' order by datetime desc limit 333");
$columns_total = mysql_num_fields($sql);
// Get The Field Name
for ($i = 0; $i < $columns_total; $i++) {
$heading = mysql_field_name($sql, $i);
$output .= '"'.$heading.'",';
}
$output .="\n";
// Get Records from the table
while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$output .='"'.$row["$i"].'",';
}
$output .="\n";
}
// Save the file
$directory = "/var/www/vhosts/domain.nl/httpdocs/data/";
$filename = "1day.csv";
$fd = fopen ("$directory" . $filename, "w");
fputs($fd, $output);
fclose($fd);
exit;
The part where i get stuck is to add the extra column with the calculated value.
I have a php script that exports a data from mysql into the csv. Everything worked fine, when the script was smaller but now, when it reaches a numerous code lines it doesn't do the job.
PROBLEM: it export csv file regularly, but all the tables results are in the first cell of excel. It is supposed to fill each cell - it should recognize in database where there is a comma, then use delimiter and split into cells separately.
So, the delimiter is not working and I don't know why. It should use commas and split it, and it should use | to split again.
This is the code:
$link = mysql_connect($host, $user, $pass) or die("Can not connect." . mysql_error());
mysql_select_db($db) or die("Can not connect.");
$result = mysql_query("SHOW COLUMNS FROM ".$table."");
$columnName = array();
if (mysql_num_rows($result) > 0)
{
while ($row = mysql_fetch_assoc($result))
{
$columnName[] = $row['Field'];
$i++;
}
}
$columnName[] .= "\n";
$needle = '|';
$values = mysql_query("SELECT * FROM ".$table." where id=".$id."");
while ($rowr = mysql_fetch_row($values))
{
for ($j=0;$j<$i;$j++)
{
$colName = $columnName[$j];
$count = strlen($rowr[$j]) - strlen(str_replace(str_split($needle), '', $rowr[$j]));
if ($count > 1)
{
for($p=0;$p<$count;$p++)
{
$colName .= ",";
}
$columnName[$j] = $colName;
$csv_output_column_names .= $columnName[$j].", ";
$csv_output_column_values .= str_replace('|',',',$rowr[$j]).", ";
}
else
{
$csv_output_column_names .= $columnName[$j].", ";
$csv_output_column_values .= $rowr[$j] .", ";
}
}
$csv_output_column_values .= "\n";
}
$csv_output = $csv_output_column_names."\n".$csv_output_column_values;
$filename = $file."_".date("Y-m-d");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
print $csv_output;
exit;
?>
Your issue is that you're not quoting fields as Excel expects it.
Instead of reinventing the wheel, you should use the already existing fgetcsv and fputcsv functions.
Normally these are used to write to files, but you can create a file handle to standard out so that they're printed to screen. For example:
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: csv" . date("Y-m-d") . ".csv");
header("Content-disposition: filename=".$filename.".csv");
// $lines is a 2D array with all rows and their column data
// $columns is a 1D array with each row's columns (see examples from fputcsv documentation)
$out = fopen("php://stdout", "w");
foreach ($lines as $columns) { fputcsv($out, $columns); }
fclose($out);
You need to care about memory to begin with, including this solves the problem delimited CSV.
Example:
$file = new SplFileObject('php://output', 'w');
$file->fputcsv($rowr, ';', '"');
I Try this solution to export from my database to CSV and it work but all Data are exported in one colones. I would like that compose me in The CSV like in the table data base. What is the problem in this code ?
<?php
// Database Connection
$host="localhost";
$uname="root";
$pass="";
$database = "a2zwebhelp";
$connection=mysql_connect($host,$uname,$pass);
echo mysql_error();
//or die("Database Connection Failed");
$selectdb=mysql_select_db($database) or
die("Database could not be selected");
$result=mysql_select_db($database)
or die("database cannot be selected <br>");
// Fetch Record from Database
$output = "";
$table = ""; // Enter Your Table Name
$sql = mysql_query("select * from $table");
$columns_total = mysql_num_fields($sql);
// Get The Field Name
for ($i = 0; $i < $columns_total; $i++) {
$heading = mysql_field_name($sql, $i);
$output .= '"'.$heading.'",';
}
$output .="\n";
// Get Records from the table
while ($row = mysql_fetch_array($sql)) {
for ($i = 0; $i < $columns_total; $i++) {
$output .='"'.$row["$i"].'",';
}
$output .="\n";
}
// Download the file
$filename = "myFile.csv";
header('Content-type: application/csv');
header('Content-Disposition: attachment; filename='.$filename);
echo $output;
exit;
?>
If you use "\n" as a line separator and open that file in i.e. notepad.exe, this will not be properly recognized as "carriage return linefeed" and the entire file seems to be just "one big line" - but actually it isn't!
You may terminate lines with "\r\n" to prevent this effect.
In order to have this automatically recognized by i.e. Excel, use ; as field separator instead of ,.