Kaydet (Commit) 3e0b1754 authored tarafından Markus Mohrhard's avatar Markus Mohrhard

external data: pass the whole string to the csv parser

Change-Id: I221027f8613eaacd4fcb46d31e33185abeadae48
Reviewed-on: https://gerrit.libreoffice.org/41093Tested-by: 's avatarJenkins <ci@libreoffice.org>
Reviewed-by: 's avatarMarkus Mohrhard <markus.mohrhard@googlemail.com>
üst b37ce366
...@@ -19,80 +19,44 @@ ...@@ -19,80 +19,44 @@
namespace { namespace {
struct Cell
{
struct Str
{
size_t Pos;
size_t Size;
};
union
{
Str maStr;
double mfValue;
};
bool mbValue;
Cell();
Cell( const Cell& r );
};
struct Line
{
OString maLine;
std::vector<Cell> maCells;
};
Cell::Cell() : mfValue(0.0), mbValue(true) {}
Cell::Cell(const Cell& r) : mbValue(r.mbValue)
{
if (r.mbValue)
mfValue = r.mfValue;
else
{
maStr.Pos = r.maStr.Pos;
maStr.Size = r.maStr.Size;
}
}
class CSVHandler class CSVHandler
{ {
Line& mrLine; ScDocument* mpDoc;
size_t mnColCount; SCCOL mnCol;
size_t mnCols; SCROW mnRow;
const char* mpLineHead;
public: public:
CSVHandler( Line& rLine, size_t nColCount ) : CSVHandler(ScDocument* pDoc) :
mrLine(rLine), mnColCount(nColCount), mnCols(0), mpLineHead(rLine.maLine.getStr()) {} mpDoc(pDoc), mnCol(0), mnRow(0)
{
}
static void begin_parse() {} static void begin_parse() {}
static void end_parse() {} static void end_parse() {}
static void begin_row() {} static void begin_row() {}
static void end_row() {} void end_row()
{
++mnRow;
mnCol = 0;
}
void cell(const char* p, size_t n) void cell(const char* p, size_t n)
{ {
if (mnCols >= mnColCount) if (mnCol > MAXCOL)
return; return;
Cell aCell; double mfValue = 0.0;
if (ScStringUtil::parseSimpleNumber(p, n, '.', ',', aCell.mfValue)) if (ScStringUtil::parseSimpleNumber(p, n, '.', ',', mfValue))
{ {
aCell.mbValue = true; mpDoc->SetValue(mnCol, mnRow, 0, mfValue);
} }
else else
{ {
aCell.mbValue = false; OString aStr(p, n);
aCell.maStr.Pos = std::distance(mpLineHead, p); mpDoc->SetString(mnCol, mnRow, 0, OStringToOUString(aStr, RTL_TEXTENCODING_UTF8));
aCell.maStr.Size = n;
} }
mrLine.maCells.push_back(aCell);
++mnCols; ++mnCol;
} }
}; };
...@@ -136,41 +100,13 @@ void CSVFetchThread::execute() ...@@ -136,41 +100,13 @@ void CSVFetchThread::execute()
{ {
OStringBuffer aBuffer(64000); OStringBuffer aBuffer(64000);
std::unique_ptr<SvStream> pStream = DataProvider::FetchStreamFromURL(maURL, aBuffer); std::unique_ptr<SvStream> pStream = DataProvider::FetchStreamFromURL(maURL, aBuffer);
SCROW nCurRow = 0; if (mbTerminate)
SCCOL nCol = 0; return;
while (pStream->good())
{
if (mbTerminate)
break;
Line aLine;
aLine.maCells.clear();
pStream->ReadLine(aLine.maLine);
CSVHandler aHdl(aLine, MAXCOL);
orcus::csv_parser<CSVHandler> parser(aLine.maLine.getStr(), aLine.maLine.getLength(), aHdl, maConfig);
parser.parse();
if (aLine.maCells.empty()) CSVHandler aHdl(&mrDocument);
{ orcus::csv_parser<CSVHandler> parser(aBuffer.getStr(), aBuffer.getLength(), aHdl, maConfig);
break; parser.parse();
}
nCol = 0;
const char* pLineHead = aLine.maLine.getStr();
for (auto& rCell : aLine.maCells)
{
if (rCell.mbValue)
{
mrDocument.SetValue(ScAddress(nCol, nCurRow, 0 /* Tab */), rCell.mfValue);
}
else
{
mrDocument.SetString(nCol, nCurRow, 0 /* Tab */, OUString(pLineHead+rCell.maStr.Pos, rCell.maStr.Size, RTL_TEXTENCODING_UTF8));
}
++nCol;
}
nCurRow++;
}
SolarMutexGuard aGuard; SolarMutexGuard aGuard;
mpIdle->Start(); mpIdle->Start();
} }
......
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