/*************************************************************************** csvfile.h - description ------------------- begin : Mon Mar 28 2005 copyright : (C) 2005 by Dominik Seichter email : domseichter@web.de ***************************************************************************/ /*************************************************************************** * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * ***************************************************************************/ #include "csvfile.h" #include "printersettings.h" #include #include CSVFile::CSVFile( const TQString & filename ) { m_eof = false; m_csv = true; m_quote = PrinterSettings::getInstance()->getData()->quote; m_separator = PrinterSettings::getInstance()->getData()->separator; m_comment = PrinterSettings::getInstance()->getData()->comment; m_file.setName( filename ); m_file.open( IO_ReadOnly ); if( m_file.isOpen() ) m_stream.setDevice( TQT_TQIODEVICE(&m_file) ); } CSVFile::CSVFile( TQBuffer & buf ) { m_eof = false; m_csv = true; m_quote = PrinterSettings::getInstance()->getData()->quote; m_separator = PrinterSettings::getInstance()->getData()->separator; m_comment = PrinterSettings::getInstance()->getData()->comment; buf.open( IO_ReadOnly ); if( buf.isOpen() ) m_stream.setDevice( TQT_TQIODEVICE(&buf) ); } CSVFile::~CSVFile() { if( m_stream.device() && m_stream.device()->isOpen() ) m_stream.device()->close(); } TQStringList CSVFile::readNextLine() { TQString line; if( !m_stream.device() ) return TQStringList(); if( !m_stream.device()->isOpen() ) return TQStringList(); // walk through the lines until a line containing valid data for( ;; ) { line = m_stream.readLine(); line = line.stripWhiteSpace(); // check for eof if( line.isNull() ) { m_eof = true; return TQStringList(); } // ignore comments and empty lines if( (!m_comment.isEmpty() && line.startsWith( m_comment )) || line.isEmpty() ) continue; break; } return m_csv ? readCsvLine( line ) : readFixedLine( line ); } TQStringList CSVFile::readCsvLine( const TQString & l ) { TQString line( l ); TQStringList sections; unsigned int start = 0; unsigned int end = 0; unsigned int len; bool quoted = false; bool quote_empty; // if line does not end with separator, add one if( !line.endsWith( m_separator ) ) line.append( m_separator ); // we have to handle here the case, // that the separator is included // in a quoted field len = line.length(); // cache for better speed quote_empty = m_quote.isEmpty(); while( end < len ) { if( !quote_empty && line.right( len - end ).startsWith( m_quote ) ) quoted = !quoted; else if( !quoted && line.right( len - end ).startsWith( m_separator ) ) { sections << removeQuote( line.mid( start, end-start ) ); start = end; ++start; } else if( line[end] == '\n' ) break; ++end; } return sections; } TQStringList CSVFile::readFixedLine( const TQString & line ) { TQString data( line ); TQStringList list; for( unsigned int i=0;i