[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: branches/koffice/1.6/koffice/kexi/plugins/importexport/csv
From: Jaroslaw Staniek <js () iidea ! pl>
Date: 2008-05-09 14:30:08
Message-ID: 1210343408.659074.1361.nullmailer () svn ! kde ! org
[Download RAW message or body]
SVN commit 805884 by staniek:
CSV Import Dialog
- fix setting data types for columns, previously text type was used instead
- fix autodetecting and importing of floating-point values in "E scientificnotation"
- output null values to fields if value coversion failed (e.g. text-to-date);
without this subsequent values are written into the wrong columns
- added "Date format" import option with possible values: auto, DMY, YMD, MDY
BUG: 147809
BUG: 151478
M +36 -14 kexicsvimportdialog.cpp
M +2 -2 kexicsvimportdialog.h
M +76 -21 kexicsvimportoptionsdlg.cpp
M +14 -3 kexicsvimportoptionsdlg.h
--- branches/koffice/1.6/koffice/kexi/plugins/importexport/csv/kexicsvimportdialog.cpp \
#805883:805884 @@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2005-2006 Jaroslaw Staniek <js@iidea.pl>
+ Copyright (C) 2005-2008 Jaroslaw Staniek <js@iidea.pl>
This work is based on kspread/dialogs/kspread_dlg_csv.cc
and will be merged back with KOffice libraries.
@@ -299,7 +299,9 @@
m_dateRegExp = QRegExp("(\\d{1,4})([/\\-\\.])(\\d{1,2})([/\\-\\.])(\\d{1,4})");
m_timeRegExp1 = QRegExp("(\\d{1,2}):(\\d{1,2}):(\\d{1,2})");
m_timeRegExp2 = QRegExp("(\\d{1,2}):(\\d{1,2})");
- m_fpNumberRegExp = QRegExp("[\\-]{0,1}\\d*[,\\.]\\d+");
+ m_fpNumberRegExp1 = QRegExp("[\\-]{0,1}\\d*[,\\.]\\d+");
+ // E notation, e.g. 0.1e2, 0.1e+2, 0.1e-2, 0.1E2, 0.1E+2, 0.1E-2
+ m_fpNumberRegExp2 = QRegExp("[\\-]{0,1}\\d*[,\\.]\\d+[Ee][+-]{0,1}\\d+");
QString caption( i18n("Open CSV Data File") );
if (m_mode == File) {
@@ -974,9 +976,7 @@
//detect type because it's 1st row or all prev. rows were not text
//-FP number? (trying before "number" type is a must)
if (!found && (row==1 || type==_NUMBER_TYPE || type==_FP_NUMBER_TYPE || \
type==_NO_TYPE_YET)) {
- bool ok = text.isEmpty() || m_fpNumberRegExp.exactMatch(text);
- //if (!ok)
- // text.toDouble(&ok);
+ bool ok = text.isEmpty() || m_fpNumberRegExp1.exactMatch(text) || \
m_fpNumberRegExp2.exactMatch(text); if (ok && (row==1 || type==_NUMBER_TYPE || \
type==_FP_NUMBER_TYPE || type==_NO_TYPE_YET)) { \
m_detectedTypes[col]=_FP_NUMBER_TYPE; found = true; //yes
@@ -1064,13 +1064,22 @@
//dddd - dd - dddd
//1 2 3 4 5 <- pos
const int d1 = m_dateRegExp.cap(1).toInt(), d3 = m_dateRegExp.cap(3).toInt(), d5 = \
m_dateRegExp.cap(5).toInt();
- if (m_dateRegExp.cap(2)=="/") //probably separator for american format mm/dd/yyyy
- date = QDate(d5, d1, d3);
- else {
- if (d5 > 31) //d5 == year
- date = QDate(d5, d3, d1);
- else //d1 == year
- date = QDate(d1, d3, d5);
+ switch (m_options.dateFormat) {
+ case KexiCSVImportOptions::DMY: date = QDate(d5, d3, d1); break;
+ case KexiCSVImportOptions::YMD: date = QDate(d1, d3, d5); break;
+ case KexiCSVImportOptions::MDY: date = QDate(d5, d1, d3); break;
+ case KexiCSVImportOptions::AutoDateFormat:
+ if (m_dateRegExp.cap(2) == "/") { //probably separator for american format \
mm/dd/yyyy + date = QDate(d5, d1, d3);
+ }
+ else {
+ if (d5 > 31) //d5 == year
+ date = QDate(d5, d3, d1);
+ else //d1 == year
+ date = QDate(d1, d3, d5);
+ }
+ break;
+ default:;
}
return date.isValid();
}
@@ -1090,6 +1099,9 @@
void KexiCSVImportDialog::setText(int row, int col, const QString& text, bool inGUI)
{
if (!inGUI) {
+ if (row==1 && m_1stRowForFieldNames->isChecked())
+ return; // do not care about this value if it contains column names (these were \
already used) +
//save text directly to database buffer
if (col==1) { //1st col
m_importingStatement->clearArguments();
@@ -1117,11 +1129,15 @@
QDate date;
if (parseDate(text, date))
*m_importingStatement << date;
+ else
+ *m_importingStatement << QVariant();
}
else if (detectedType==_TIME_TYPE) {
QTime time;
if (parseTime(text, time))
*m_importingStatement << time;
+ else
+ *m_importingStatement << QVariant();
}
else if (detectedType==_DATETIME_TYPE) {
QStringList dateTimeList( QStringList::split(" ", text) );
@@ -1136,8 +1152,14 @@
QTime time;
if (parseTime(timePart, time))
*m_importingStatement << QDateTime(date, time);
+ else
+ *m_importingStatement << QVariant();
}
+ else
+ *m_importingStatement << QVariant();
}
+ else
+ *m_importingStatement << QVariant();
}
else //_TEXT_TYPE and the rest
*m_importingStatement << (m_options.stripWhiteSpaceInTextValuesChecked ? \
text.stripWhiteSpace() : text); @@ -1452,9 +1474,9 @@
KexiDB::Field::Type fieldType;
if (detectedType==_DATE_TYPE)
fieldType = KexiDB::Field::Date;
- if (detectedType==_TIME_TYPE)
+ else if (detectedType==_TIME_TYPE)
fieldType = KexiDB::Field::Time;
- if (detectedType==_DATETIME_TYPE)
+ else if (detectedType==_DATETIME_TYPE)
fieldType = KexiDB::Field::DateTime;
else if (detectedType==_NUMBER_TYPE)
fieldType = KexiDB::Field::Integer;
--- branches/koffice/1.6/koffice/kexi/plugins/importexport/csv/kexicsvimportdialog.h \
#805883:805884 @@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2005-2006 Jaroslaw Staniek <js@iidea.pl>
+ Copyright (C) 2005-2008 Jaroslaw Staniek <js@iidea.pl>
This work is based on kspread/dialogs/kspread_dlg_csv.cc
and will be merged back with KOffice libraries.
@@ -186,7 +186,7 @@
//! (only for numeric type)
QPtrVector< QValueList<int> > m_uniquenessTest;
- QRegExp m_dateRegExp, m_timeRegExp1, m_timeRegExp2, m_fpNumberRegExp;
+ QRegExp m_dateRegExp, m_timeRegExp1, m_timeRegExp2, m_fpNumberRegExp1, \
m_fpNumberRegExp2; QValueVector<QString> m_typeNames, m_columnNames;
QBitArray m_changedColumnNames;
bool m_columnsAdjusted : 1; //!< to call adjustColumn() only once
--- branches/koffice/1.6/koffice/kexi/plugins/importexport/csv/kexicsvimportoptionsdlg.cpp \
#805883:805884 @@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2005-2006 Jaroslaw Staniek <js@iidea.pl>
+ Copyright (C) 2005-2008 Jaroslaw Staniek <js@iidea.pl>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -24,6 +24,7 @@
#include <qlayout.h>
#include <qtextcodec.h>
#include <qcheckbox.h>
+#include <qgroupbox.h>
#include <kapplication.h>
#include <kconfig.h>
@@ -32,10 +33,33 @@
#include <kglobal.h>
#include <kcharsets.h>
+KexiCSVImportOptions::DateFormat dateFormatFromString( const QString& s )
+{
+ QString str( s.lower().stripWhiteSpace() );
+ if (str == "dmy")
+ return KexiCSVImportOptions::DMY;
+ if (str == "ymd")
+ return KexiCSVImportOptions::YMD;
+ if (str == "mdy")
+ return KexiCSVImportOptions::MDY;
+ return KexiCSVImportOptions::AutoDateFormat;
+}
+
+QString dateFormatToString( KexiCSVImportOptions::DateFormat format )
+{
+ switch (format) {
+ case KexiCSVImportOptions::DMY: return "DMY";
+ case KexiCSVImportOptions::YMD: return "YMD";
+ case KexiCSVImportOptions::MDY: return "MDY";
+ default: break;
+ }
+ return QString::null;
+}
+
KexiCSVImportOptions::KexiCSVImportOptions()
{
- kapp->config()->setGroup("ImportExport");
- encoding = kapp->config()->readEntry("DefaultEncodingForImportingCSVFiles");
+ KConfigGroup cg( kapp->config(), "ImportExport" );
+ encoding = cg.readEntry("DefaultEncodingForImportingCSVFiles");
if (encoding.isEmpty()) {
encoding = QString::fromLatin1(KGlobal::locale()->encoding());
defaultEncodingExplicitySet = false;
@@ -43,8 +67,9 @@
else
defaultEncodingExplicitySet = true;
- stripWhiteSpaceInTextValuesChecked
- = kapp->config()->readBoolEntry("StripBlanksOffOfTextValuesWhenImportingCSVFiles", \
true); + dateFormat = dateFormatFromString( \
cg.readEntry("DateFormatWhenImportingCSVFiles") ); +
+ stripWhiteSpaceInTextValuesChecked = \
cg.readBoolEntry("StripBlanksOffOfTextValuesWhenImportingCSVFiles", true); }
KexiCSVImportOptions::~KexiCSVImportOptions()
@@ -55,7 +80,8 @@
{
return defaultEncodingExplicitySet==opt.defaultEncodingExplicitySet
&& stripWhiteSpaceInTextValuesChecked==opt.stripWhiteSpaceInTextValuesChecked
- && encoding==opt.encoding;
+ && encoding==opt.encoding
+ && dateFormat==opt.dateFormat;
}
bool KexiCSVImportOptions::operator!= ( const KexiCSVImportOptions & opt ) const
@@ -78,32 +104,54 @@
false
)
{
- QGridLayout *lyr = new QGridLayout( plainPage(), 5, 3,
- KDialogBase::marginHint(), KDialogBase::spacingHint());
+ QGridLayout *lyr = new QGridLayout( plainPage(), 4, 3,
+ 0, KDialogBase::spacingHint());
- m_encodingComboBox = new KexiCharacterEncodingComboBox(plainPage(), \
options.encoding);
- lyr->addWidget( m_encodingComboBox, 0, 1 );
+//! @todo fix i18n here
+ QGroupBox* textEncodingGroupBox = new QGroupBox(
+ i18n("Text encoding:").replace(":", "") /* a hack to avoid adding new string */, \
plainPage() ); + lyr->addMultiCellWidget( textEncodingGroupBox, 0, 0, 0, 1 );
+ QVBoxLayout* textEncodingGroupBoxLyr = new QVBoxLayout( textEncodingGroupBox, \
KDialogBase::spacingHint(), KDialogBase::spacingHint() ); \
+ textEncodingGroupBoxLyr->addItem( new QSpacerItem( 20, 15, QSizePolicy::Fixed, \
QSizePolicy::Fixed ) );
- QLabel* lbl = new QLabel( m_encodingComboBox, i18n("Text encoding:"), plainPage());
+ m_encodingComboBox = new KexiCharacterEncodingComboBox(textEncodingGroupBox, \
options.encoding); + textEncodingGroupBoxLyr->addWidget( m_encodingComboBox );
+
+/* QLabel* lbl = new QLabel( m_encodingComboBox, i18n("Text encoding:"), \
plainPage()); lyr->addWidget( lbl, 0, 0 );
- lyr->addItem( new QSpacerItem( 20, KDialogBase::spacingHint(), QSizePolicy::Fixed, \
QSizePolicy::Fixed ), 2, 1 );
- lyr->addItem( new QSpacerItem( 121, KDialogBase::spacingHint(), \
QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 ); + lyr->addItem( new \
QSpacerItem( 20, KDialogBase::spacingHint(), QSizePolicy::Fixed, QSizePolicy::Fixed \
), 2, 1 );*/ + lyr->addItem( new QSpacerItem( 20, KDialogBase::spacingHint(), \
QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 );
m_chkAlwaysUseThisEncoding = new QCheckBox(
- i18n("Always use this encoding when importing CSV data files"), plainPage());
- lyr->addWidget( m_chkAlwaysUseThisEncoding, 1, 1 );
+ i18n("Always use this encoding when importing CSV data files"), \
textEncodingGroupBox); + textEncodingGroupBoxLyr->addWidget( \
m_chkAlwaysUseThisEncoding );
+ m_comboDateFormat = new QComboBox( plainPage() );
+ m_comboDateFormat->setName( "m_comboDateFormat" );
+// m_comboDateFormat->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred \
); + m_comboDateFormat->insertItem( i18n("Date format: Auto", "Auto") );
+ QString year( i18n("year") ), month( i18n("month") ), day( i18n("day") );
+ QString mask( i18n("\"month, year, day\" mask", "%1, %2, %3 (e.g. %4-%5-%6)") );
+ m_comboDateFormat->insertItem( \
mask.arg(day).arg(month).arg(year).arg(30).arg(12).arg(2008) ); \
+ m_comboDateFormat->insertItem( \
mask.arg(year).arg(month).arg(day).arg(2008).arg(12).arg(30) ); \
+ m_comboDateFormat->insertItem( \
mask.arg(month).arg(day).arg(year).arg(12).arg(30).arg(2008) ); + lyr->addWidget( \
m_comboDateFormat, 1, 1 ); +
+ QLabel* lblDateFormat = new QLabel( m_comboDateFormat, i18n("Date format:"), \
plainPage()); + lyr->addWidget( lblDateFormat, 1, 0 );
+
m_chkStripWhiteSpaceInTextValues = new QCheckBox(
i18n("Strip leading and trailing blanks off of text values"), plainPage());
- lyr->addWidget( m_chkStripWhiteSpaceInTextValues, 3, 1 );
- lyr->addItem( new QSpacerItem( 20, KDialogBase::spacingHint(), \
QSizePolicy::Minimum, QSizePolicy::Expanding ), 4, 1 ); + lyr->addMultiCellWidget( \
m_chkStripWhiteSpaceInTextValues, 2, 2, 0, 1 ); + lyr->addItem( new QSpacerItem( 30, \
KDialogBase::spacingHint(), QSizePolicy::Minimum, QSizePolicy::Expanding ), 3, 0 );
//update widgets
if (options.defaultEncodingExplicitySet) {
m_encodingComboBox->setSelectedEncoding(options.encoding);
m_chkAlwaysUseThisEncoding->setChecked(true);
}
+ m_comboDateFormat->setCurrentItem( (int)options.dateFormat );
m_chkStripWhiteSpaceInTextValues->setChecked(options.stripWhiteSpaceInTextValuesChecked);
adjustSize();
@@ -124,14 +172,21 @@
void KexiCSVImportOptionsDialog::accept()
{
- kapp->config()->setGroup("ImportExport");
+ KConfigGroup cg( kapp->config(), "ImportExport" );
if (m_chkAlwaysUseThisEncoding->isChecked())
- kapp->config()->writeEntry("DefaultEncodingForImportingCSVFiles",
+ cg.writeEntry("DefaultEncodingForImportingCSVFiles",
m_encodingComboBox->selectedEncoding());
else
- kapp->config()->deleteEntry("DefaultEncodingForImportingCSVFiles");
+ cg.deleteEntry("DefaultEncodingForImportingCSVFiles");
- kapp->config()->writeEntry("StripBlanksOffOfTextValuesWhenImportingCSVFiles",
+ const KexiCSVImportOptions::DateFormat dateFormat
+ = (KexiCSVImportOptions::DateFormat)m_comboDateFormat->currentItem();
+ if (dateFormat == KexiCSVImportOptions::AutoDateFormat)
+ cg.deleteEntry("DateFormatWhenImportingCSVFiles");
+ else
+ cg.writeEntry("DateFormatWhenImportingCSVFiles", dateFormatToString( dateFormat \
)); +
+ cg.writeEntry("StripBlanksOffOfTextValuesWhenImportingCSVFiles",
m_chkStripWhiteSpaceInTextValues->isChecked());
KDialogBase::accept();
--- branches/koffice/1.6/koffice/kexi/plugins/importexport/csv/kexicsvimportoptionsdlg.h \
#805883:805884 @@ -1,5 +1,5 @@
/* This file is part of the KDE project
- Copyright (C) 2005 Jaroslaw Staniek <js@iidea.pl>
+ Copyright (C) 2005-2008 Jaroslaw Staniek <js@iidea.pl>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -24,6 +24,7 @@
#include <qcheckbox.h>
class KexiCharacterEncodingComboBox;
+class QComboBox;
//! @short CSV Options
class KexiCSVImportOptions
@@ -32,12 +33,21 @@
KexiCSVImportOptions();
~KexiCSVImportOptions();
+ //! Date format values
+ enum DateFormat {
+ AutoDateFormat = 0, //!< auto
+ DMY = 1, //!< day-month-year
+ YMD = 2, //!< year-month-day
+ MDY = 3 //!< month-day-year
+ };
+
bool operator== ( const KexiCSVImportOptions & opt ) const;
bool operator!= ( const KexiCSVImportOptions & opt ) const;
QString encoding;
- bool defaultEncodingExplicitySet;
- bool stripWhiteSpaceInTextValuesChecked;
+ DateFormat dateFormat;
+ bool defaultEncodingExplicitySet : 1;
+ bool stripWhiteSpaceInTextValuesChecked : 1;
};
//! @short CSV Options dialog
@@ -57,6 +67,7 @@
KexiCharacterEncodingComboBox *m_encodingComboBox;
QCheckBox *m_chkAlwaysUseThisEncoding;
QCheckBox *m_chkStripWhiteSpaceInTextValues;
+ QComboBox *m_comboDateFormat;
};
#endif
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic