/[cvs]/nfo/php/libs/com.newsblob.phphtmllib/widgets/data_list/CSVFILEDataListSource.inc
ViewVC logotype

Annotation of /nfo/php/libs/com.newsblob.phphtmllib/widgets/data_list/CSVFILEDataListSource.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.3 - (hide annotations)
Thu May 6 12:59:55 2004 UTC (20 years, 4 months ago) by jonen
Branch: MAIN
Changes since 1.2: +9 -3 lines
 updated to v2.3.0 - July 31, 2003

1 jonen 1.1 <?php
2     /**
3     * This file contains the DataListSource class
4     * that gets the data from a CSV formatted file.
5     *
6     *
7 jonen 1.3 * $Id: CSVFILEDataListSource.inc,v 1.3 2003/04/29 06:38:05 hemna Exp $
8 jonen 1.1 *
9     * @author Walter A. Boring IV <waboring@buildabetterweb.com>
10     * @package phpHtmlLib
11     */
12    
13    
14    
15     /**
16     *
17     * This DataListSource child class gets the data from a
18     * CSV (comma seperated values) file on disk.
19     *
20     * The CSV MUST have a 'header' line before any data.
21     * The 'header' line is a CSV line that provides a name
22     * for each column of data in the file.
23     *
24     * All lines that start with '#' or '//' are ignored as
25     * comments.
26     *
27     *
28     * @author Walter A. Boring IV <waboring@buildabetterweb.com>
29     * @package phpHtmlLib
30     */
31     class CSVFILEDataListSource extends DataListSource {
32    
33    
34     /**
35     * The csv file name/path on disk
36     *
37     */
38     var $_filename = NULL;
39    
40     /**
41     * The file descriptor pointer
42     *
43     */
44     var $_fp = NULL;
45    
46    
47     /**
48     * this holds the headers read
49     * from the top of the csv file
50     */
51     var $_csv_headers = array();
52    
53     /**
54     * The length of the longest
55     * line in the csv file
56     * (so we read the line properly)
57     */
58     var $_maxlinelength=4096;
59    
60    
61    
62     /**
63     * The constructor.
64     *
65     * @param string - the path to the CSV file on
66     * on disk to use as the data source.
67     *
68     */
69     function CSVFILEDataListSource( $filename, $maxline=4096 ) {
70     if (!file_exists($filename)) {
71     user_error("CSVFILEDataListSource:: (".$filename.") ".
72     "can't be found.");
73     } else {
74     $this->_filename = $filename;
75     $this->_fp = fopen( $filename, 'r');
76     if (!$this->_fp) {
77     user_error("CSVFILEDataListSource:: (".$filename.") ".
78     "cannot be opened");
79     }
80     }
81     $this->_maxlinelength = $maxline;
82     }
83    
84    
85     /**
86     * The prequery. We use this to read the file
87     * into memory so we can do operations on the data
88     * (search, sort, etc.)
89     */
90     function do_prequery() {
91     $this->_get_header();
92     }
93    
94     /**
95     * This function does the query
96     * and search/sort
97     */
98     function do_query() {
99 jonen 1.3 $count = 0;
100 jonen 1.1 while ($line = fgets($this->_fp, $this->_maxlinelength)) {
101     if ($this->add_data_row( $this->_construct_row(trim($line)))) {
102     $count++;
103     }
104     }
105    
106     //close the file
107     fclose($this->_fp);
108 jonen 1.3 if ($count > 0) {
109     $this->set_total_rows( $count );
110     $this->sort();
111     return true;
112     } else {
113     return false;
114     }
115 jonen 1.1 }
116    
117     /**
118     * This function returns the next row of
119     * valid data.
120     *
121     */
122     function get_next_data_row() {
123     $index = $this->get_data_index();
124     $limit = $this->get_limit();
125     $offset = $this->get_offset();
126    
127     if ($limit == -1) {
128     //don't limit the data
129     if ($index > $this->get_total_rows()) {
130     return NULL;
131     } else {
132     return $this->_data[$index];
133     }
134     } else {
135     $left_to_show = $limit - ($index - $offset);
136     if ($left_to_show > 0) {
137     return $this->_data[$index];
138     } else {
139     return NULL;
140     }
141     }
142     }
143    
144    
145     /**
146     * This file trys to get the CSV header.
147     *
148     */
149     function _get_header() {
150     $done = FALSE;
151     while (!$done) {
152     $line = trim(fgets($this->_fp,$this->_maxlinelength));
153     if (strncmp('#', $line, 1) != 0 &&
154     strncmp('//', $line, 2) != 0 && !empty($line)) {
155     $this->_csv_headers = explode(',', $line);
156     $done = TRUE;
157     }
158     }
159     }
160    
161    
162     /**
163     * this is used to build a row
164     * from a csv line
165     *
166     * @param string - the original csv line from the file
167     * @return array
168     */
169     function _construct_row( $line ) {
170     $row = NULL;
171     if (strncmp('#', $line, 1) != 0 &&
172     strncmp('//', $line, 2) != 0 && !empty($line)) {
173     $tmp = explode(",", $line);
174     //xmp_var_dump( $row );
175     $row = array();
176     foreach( $this->_csv_headers as $index => $name ) {
177     $row[$name] = $tmp[$index];
178     }
179     }
180    
181     //xmp_var_dump( $row );
182     return $row;
183     }
184    
185    
186    
187     /**
188     * This function adds a row of data
189     * if necesarry to the data array
190     *
191     */
192     function add_data_row($row) {
193     if ($row != NULL) {
194     if ($this->get_searchby_value()) {
195     //user wants to search the data
196     if ($this->_find_data($row) ) {
197     $this->_data[] = $row;
198     return TRUE;
199     } else {
200     return FALSE;
201     }
202     } else {
203     $this->_data[] = $row;
204     return TRUE;
205     }
206     } else {
207     return FALSE;
208     }
209     }
210    
211     function sort() {
212     $sortby = $this->get_orderby();
213     //ok we need to sort the data by the
214     //column in the table
215     if ($this->_is_column_sortable($sortby)) {
216     //looks like we can sort this column
217     usort($this->_data, array($this, "cmp"));
218     }
219     }
220    
221     function cmp($data1, $data2) {
222     $sortby = $this->get_orderby();
223     $ret = strnatcmp( $data1[$sortby], $data2[$sortby]);
224     if ($this->get_reverseorder() == "true") {
225     $ret *= -1;
226     }
227     return $ret;
228     }
229    
230     function _find_data( $row_data ) {
231     //look for the 'needle' in the 'haystack'
232    
233     $needle = $this->get_searchby_value();
234     $haystack = $row_data[$this->get_searchby()];
235    
236     switch ($this->get_simplesearch_modifier()) {
237     case "BEGINS":
238     if (strncasecmp($needle, $haystack, strlen($needle)) == 0) {
239     return TRUE;
240     } else {
241     return FALSE;
242     }
243     break;
244    
245     case "CONTAINS":
246     if (stristr($haystack, $needle)) {
247     return TRUE;
248     } else {
249     return FALSE;
250     }
251     break;
252     case "EXACT":
253     if (strcasecmp($needle, $haystack) == 0) {
254     return TRUE;
255     } else {
256     return FALSE;
257     }
258     break;
259     case "ENDS":
260     $needle_len = strlen( $needle );
261     $haystack_len = strlen( $haystack );
262     if ($needle_len > $haystack_len) {
263     return FALSE;
264     } else if ($needle_len == $haystack_len) {
265     $tmp = $haystack;
266     } else {
267     $tmp = substr($haystack, $haystack_len - $needle_len);
268     }
269     if (strncasecmp($needle, $tmp, $needle_len) == 0) {
270     return TRUE;
271     } else {
272     return FALSE;
273     }
274     break;
275     }
276     }
277    
278     }
279     ?>

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed