Kaydet (Commit) 5af6437f authored tarafından Eike Rathke's avatar Eike Rathke

resolved fdo#53449 weight given separators to pick one for output

Change-Id: Iaef3ed270d870f7c26062cdbbc9bf243bc5b5a78
üst d198d2fb
......@@ -179,6 +179,25 @@ bool ScAsciiOptions::operator==( const ScAsciiOptions& rCmp ) const
return false;
}
String lcl_decodeSepString( const String & rSepNums, bool & o_bMergeFieldSeps )
{
String aFieldSeps;
xub_StrLen nSub = comphelper::string::getTokenCount( rSepNums, '/');
for (xub_StrLen i=0; i<nSub; ++i)
{
String aCode = rSepNums.GetToken( i, '/' );
if ( aCode.EqualsAscii(pStrMrg) )
o_bMergeFieldSeps = true;
else
{
sal_Int32 nVal = aCode.ToInt32();
if ( nVal )
aFieldSeps += (sal_Unicode) nVal;
}
}
return aFieldSeps;
}
// The options string must not contain semicolons (because of the pick list),
// use comma as separator.
......@@ -186,31 +205,16 @@ void ScAsciiOptions::ReadFromString( const String& rString )
{
xub_StrLen nCount = comphelper::string::getTokenCount(rString, ',');
String aToken;
xub_StrLen nSub;
xub_StrLen i;
// Field separator.
if ( nCount >= 1 )
{
bFixedLen = bMergeFieldSeps = false;
aFieldSeps.Erase();
aToken = rString.GetToken(0,',');
if ( aToken.EqualsAscii(pStrFix) )
bFixedLen = true;
nSub = comphelper::string::getTokenCount(aToken, '/');
for ( i=0; i<nSub; i++ )
{
String aCode = aToken.GetToken( i, '/' );
if ( aCode.EqualsAscii(pStrMrg) )
bMergeFieldSeps = true;
else
{
sal_Int32 nVal = aCode.ToInt32();
if ( nVal )
aFieldSeps += (sal_Unicode) nVal;
}
}
aFieldSeps = lcl_decodeSepString( aToken, bMergeFieldSeps);
}
// Text separator.
......@@ -242,7 +246,7 @@ void ScAsciiOptions::ReadFromString( const String& rString )
delete[] pColFormat;
aToken = rString.GetToken(4,',');
nSub = comphelper::string::getTokenCount(aToken, '/');
xub_StrLen nSub = comphelper::string::getTokenCount(aToken, '/');
nInfoCount = nSub / 2;
if (nInfoCount)
{
......@@ -354,4 +358,27 @@ String ScAsciiOptions::WriteToString() const
return aOutStr;
}
// static
sal_Unicode ScAsciiOptions::GetWeightedFieldSep( const String & rFieldSeps, bool bDecodeNumbers )
{
bool bMergeFieldSeps = false;
String aFieldSeps( bDecodeNumbers ? lcl_decodeSepString( rFieldSeps, bMergeFieldSeps) : rFieldSeps);
if (aFieldSeps.Len() <= 1)
return aFieldSeps.GetChar(0);
else
{
// There can be only one separator for output. See also fdo#53449
if (aFieldSeps.Search(',') != STRING_NOTFOUND)
return ',';
else if (aFieldSeps.Search('\t') != STRING_NOTFOUND)
return '\t';
else if (aFieldSeps.Search(';') != STRING_NOTFOUND)
return ';';
else if (aFieldSeps.Search(' ') != STRING_NOTFOUND)
return ' ';
else
return aFieldSeps.GetChar(0);
}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
......@@ -18,6 +18,7 @@
*/
#include "imoptdlg.hxx"
#include "asciiopt.hxx"
#include "scresid.hxx"
#include "imoptdlg.hrc"
#include <comphelper/string.hxx>
......@@ -51,7 +52,7 @@ ScImportOptions::ScImportOptions( const String& rStr )
if( aToken.EqualsIgnoreCaseAscii( pStrFix ) )
bFixedWidth = sal_True;
else
nFieldSepCode = (sal_Unicode) aToken.ToInt32();
nFieldSepCode = ScAsciiOptions::GetWeightedFieldSep( aToken, true);
nTextSepCode = (sal_Unicode) rStr.GetToken(1,',').ToInt32();
aStrFont = rStr.GetToken(2,',');
eCharSet = ScGlobal::GetCharsetValue(aStrFont);
......
......@@ -187,7 +187,7 @@ void ScImportExport::SetExtOptions( const ScAsciiOptions& rOpt )
// "normale" Optionen uebernehmen
cSep = rOpt.GetFieldSeps().GetChar(0);
cSep = ScAsciiOptions::GetWeightedFieldSep( rOpt.GetFieldSeps(), false);
cStr = rOpt.GetTextSep();
}
......
......@@ -96,6 +96,19 @@ public:
void SetColInfo( sal_uInt16 nCount, const sal_Int32* pStart, const sal_uInt8* pFormat );
void SetColumnInfo( const ScCsvExpDataVec& rDataVec );
/** From the import field separators obtain the one most likely to be used
for export, if multiple separators weighted comma, tab, semicolon,
space and other.
@param bDecodeNumbers
If TRUE, the separators are encoded as numbers and need to be
decoded before characters can be extracted, for example "59/44"
to ";,".
If FALSE, the string is taken as is and each character is
expected to be one separator.
*/
static sal_Unicode GetWeightedFieldSep( const String & rFieldSeps, bool bDecodeNumbers );
};
/// How ScImportAsciiDlg is called
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment