Parse CSV
Reads a CSV, either local or remote, and outputs in HTML table and/or total of selected column.
Usage: $jlv_csv->printTable(); $jlv_csv->printColumnTotal(2);
jlv-read-csv.php
<?php
/*
Plugin Name: CSV Parser
Plugin URI: https://abuyasmeen.com/parse-csv/
Description: Loads a CSV file and ouputs either a column total or a formatted html table.
Version: 0.1
Author: Jeremy Varnham
Author URI: https://abuyasmeen.com
License: GPL2
*/
define('JLV_PLUGIN_PATH', WP_PLUGIN_DIR.'/'. dirname( plugin_basename( __FILE__ ) ));
require_once( JLV_PLUGIN_PATH . '/php/jlv-csv-functions.php' );
$jlv_csv = new CSVParser;
/**
* Set input
*/
$jlv_csv->setInputFile('https://dl.dropboxusercontent.com/u/3542031/Attendance_Data.csv');
$jlv_csv->setOutputStyle('bootstrap.min');
/**
* Do output
*/
// $jlv_csv->printTable();
// echo '<br><b>Total Attendees: </b> ';
// $jlv_csv->printColumnTotal(2);
?>
jlv-csv-functions.php
<?php
/**
*
* Loads a CSV file and ouputs either a column total or a formatted html table.
*
*/
## =================== INITIATE =================== ##
## 1. Make new instance:
// $sap_stats = new CSVParser;
## 2. Set source file (CSV) either local or remote (e.g. dropbox public folder or google spreadsheet)
# e.g. $source_file = 'https://docs.google.com/spreadsheet/pub?key=0AuzaQN6Gty3IdFdqR3RJandpVDBaYWMzXzVnM2xHakE&single=true&gid=0&output=csv';
# e.g. $source_file = 'https://dl.dropboxusercontent.com/u/3542031/test.csv';
# if not specified, defaults to test.csv in assets folder
// $sap_stats->setInputFile($source_file);
## 3. Set output style (CSS) - name of file without ".css"
# e.g. "fancy", "bootstrap.min"
# if not specified, defaults to "simple"
// $sap_stats->setOutputStyle('bootstrap.min');
## ============== AVAILABLE OUTPUTS ============== ##
## Total of specified column (first column = 1, second column = 2, etc)
# Either prints :
// $sap_stats->printColumnTotal(2);
# or gets :
// $sap_stats->getColumnTotal(2);
## Formatted HTML table of CSV data
# Either prints:
// $sap_stats->printTable();
# or gets :
// $sap_stats->getTable();
## ============ OTHER PUBLIC FUNCTIONS ============ ##
## printVars : prints the currently selected style and input file (for testing)
// $sap_stats->printVars();
define('JLV_PLUGIN_PATH', WP_PLUGIN_DIR.'/'. dirname( plugin_basename( __FILE__ ) ));
define('JLV_STYLE_PATH', JLV_PLUGIN_PATH.'/styles/');
define('JLV_ASSETS_PATH', JLV_PLUGIN_PATH.'/assets/');
Class CSVParser {
/**
* Set defaults
*/
private $input_file = 'test.csv';
private $css_style = 'simple';
private $the_error = '';
/**
* Check for user overrides to defaults
*/
public function setInputFile($user_file)
{
$this->input_file = $user_file;
}
public function setOutputStyle($user_style) {
$jlv_style_path = JLV_STYLE_PATH;
if ($this->doesFileExist($jlv_style_path.$user_style.'.css', 'csv'))
{
$this->css_style = $user_style;
}
return;
}
/**
* Public functions: Ouputs formatted table / total of one column.
* either returns value (getX) or prints value (printX)
*/
public function printColumnTotal($column_number) {
//$this->getHeader();
echo $this->readCSV($column_number);
$this->getFooter();
}
public function getColumnTotal($column_number) {
$the_total = $this->readCSV($column_number);
return $the_total;
}
public function printTable() {
$this->getHeader();
echo $this->readCSV(0);
//$this->getFooter();
}
public function getTable() {
$the_table = $this->readCSV(0);
return $the_table;
}
/**
* Inserts style into DOM
*/
public function getOutputStyle() {
$selected_style = $this->style_path.$this->css_style.'.css';
$verified_style = $this->doesFileExist($selected_style, 'css');
$the_style = '<style type="text/css">';
$the_style .= @file_get_contents($selected_style);
$the_style .= '</style>';
return $the_style;
}
public function printVars() { // for testing
echo 'Current style is: ' . $this->css_style;
echo '<br>';
echo 'Current file is: ' . $this->input_file;
}
private function getHeader() {
echo '<html><head>';
print_r ($this->getOutputStyle());
echo '</head><body style="padding: 50px 100px; margin: 0px auto;"><h2>Student Advocacy Program</h2><br>';
}
private function getFooter() {
echo $this->the_error;
echo '</body></html>';
}
/**
* Loads the CSV and returns either a total or a table
*/
private function readCSV($passed_column_number) {
$passed_input_file = $this->input_file;
if ($this->checkFileType($passed_input_file) == '') { // if it's not a URL, append the folder path
$passed_input_file = $this->assets_path.$passed_input_file;
}
$verified_input_file = $this->doesFileExist($passed_input_file, 'csv'); // checks if csv file exists (other option "style" determines output)
//$verified_input_file = $this->normalize($verified_input_file);
if ($passed_column_number == 0)
{
$processed_csv = $this->buildTable($verified_input_file); // no column specified, then output table
}
else {
$column = $passed_column_number - 1;
$processed_csv = $this->calcTotal($verified_input_file, $column); // column specified, calc total
}
return $processed_csv;
}
/**
* Checks if the specified file exists (CSV or CSS)
*/
private function doesFileExist($passed_input_file, $type) {
ini_set('auto_detect_line_endings',TRUE); // Allows for CSV files saved from Mac or Windows
$file = fopen($passed_input_file, "r");
if ( $file )
{ return $file; }
else {
if ( $type == 'csv' ) {
die('File does not exist');
} else {
$this->the_error = '<small style="position: absolute; bottom: 0; background: #FFC; padding: 10px; border: 1px dotted red;"><i>Error: selected style not available</i></small>';
}
}
ini_set('auto_detect_line_endings',FALSE); // Reset to default
}
/**
* Calculates total of specified column
*/
private function calcTotal($passed_handle, $passed_column_number) {
while (($data = fgetcsv($passed_handle, 1000, ",")) !== FALSE) {
$row++;
$sumtotal = $sumtotal + $data[$passed_column_number];
}
fclose($passed_handle);
return $sumtotal;
}
/**
* Parses loaded CSV data and outputs in html table format
*/
private function buildTable($passed_handle) {
$the_table = '<table class="table table-striped table-hover"><thead>';
$counter = 0;
$row = 0;
while (($data = fgetcsv($passed_handle, 1000, ",")) !== FALSE) {
$num = count($data);
$the_table .= '<tr>';
for ($c=0; $c < $num; $c++) {$counter++;
if ($row == 0) { $the_table .= '<th>'; }
else { $the_table .= '<td>'; }
$the_table .= $data[$c];
if ($row == 0) { $the_table .= '</th>'; } else { $the_table .= '</td>'; }
}
if ($counter <=1 ) { $the_table .= '</tr></thead><tbody>';}
else { $the_table .= '</tr>'; } $row++;
}
$the_table .= '</tbody></table>';
fclose($passed_handle);
return $the_table;
}
/**
* Checks if the file is a URL (to see if the local assets path should be appended)
*/
private function checkFileType($the_file) {
$file_type = substr( $the_file, 0, 4 ) === "http"; // if "file" is a URL, returns a 1
//echo $file_type;
return $file_type;
}
} // End Class CSVParser
?>
simple.css
table {
border: 1px solid red;
}
td {
height: 15px;
width: 350px;
border: 1px dotted green;
}
Also uses bootstrap CSS.