#include "stdafx.h" #include "StreamingTsvStream.h" #include "SigmaView.h" #include StreamingTsvStream::StreamingTsvStream(CSigmaView* pView, int importType) : m_pView(pView) , m_importType(importType) { if (m_importType == TableImport_Curves && m_pView != nullptr) { m_curveImporter = std::make_unique(m_pView); } m_parser.SetCallback([this](int lineIndex, const std::vector& fields) { OnParsedLine(lineIndex, fields); }); } void StreamingTsvStream::Write(const void* data, size_t size) { m_parser.Feed(data, size); } void StreamingTsvStream::Complete() { m_parser.End(); if (m_curveImporter) m_curveImporter->End(); } std::vector StreamingTsvStream::FieldsToCString(const std::vector& fields) { std::vector out; out.reserve(fields.size()); for (const auto& f : fields) { out.emplace_back(f.c_str()); } return out; } void StreamingTsvStream::OnParsedLine(int lineIndex, const std::vector& fields) { std::vector row = FieldsToCString(fields); if (row.empty()) { return; } if (lineIndex == 0) { BuildColumnIndexMapFromHeaders(row, m_columnIndexMap); if (GetRowValue(row, m_columnIndexMap, _T("X")).IsEmpty() || GetRowValue(row, m_columnIndexMap, _T("Y")).IsEmpty()) return; // 缺 X/Y 列,后续行也会被跳过 m_headersReady = true; return; } if (!m_headersReady || m_pView == nullptr) { return; } switch (m_importType) { case TableImport_Points: ImportPointRow(m_pView, m_columnIndexMap, row); break; case TableImport_XyzPoints: ImportXyzPointRow(m_pView, m_columnIndexMap, row); break; case TableImport_Curves: if (m_curveImporter) m_curveImporter->OnRow(m_columnIndexMap, row); break; default: break; } }