yql_csv.h 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include <util/stream/input.h>
  3. #include <util/stream/output.h>
  4. #include <util/generic/vector.h>
  5. namespace NYql {
  6. namespace NUtils {
  7. ///////////////////////////////////////////////////////////////////////////////
  8. // TCsvInputStream
  9. ///////////////////////////////////////////////////////////////////////////////
  10. class TCsvInputStream {
  11. public:
  12. TCsvInputStream(IInputStream& slave, char delimiter = ';');
  13. TVector<TString> ReadLine();
  14. TVector<TString> ReadLineWithEscaping();
  15. private:
  16. IInputStream& Slave_;
  17. const char Delim_;
  18. };
  19. ///////////////////////////////////////////////////////////////////////////////
  20. // TCsvInputBuffer
  21. ///////////////////////////////////////////////////////////////////////////////
  22. class TCsvInputBuffer {
  23. public:
  24. TCsvInputBuffer(const TStringBuf& buffer, char delimiter = ';');
  25. TVector<TString> ReadLine();
  26. TVector<TString> ReadLineWithEscaping();
  27. private:
  28. TStringBuf Buffer_;
  29. const char Delim_;
  30. };
  31. ///////////////////////////////////////////////////////////////////////////////
  32. // TCsvOutputStream
  33. ///////////////////////////////////////////////////////////////////////////////
  34. class TCsvOutputStream: public IOutputStream {
  35. public:
  36. TCsvOutputStream(IOutputStream& slave, char delimiter = ';', bool quoteItems = true);
  37. // hack for output empty values
  38. inline TCsvOutputStream& operator<<(const TString& value) {
  39. DoWrite(value.data(), value.size());
  40. return *this;
  41. }
  42. // hack for output empty values
  43. inline TCsvOutputStream& operator<<(const char* value) {
  44. DoWrite(value, strlen(value));
  45. return *this;
  46. }
  47. inline TCsvOutputStream& operator<<(const TVector<TString>& values) {
  48. for(const TString& value: values) {
  49. (*this) << value;
  50. }
  51. (*this) << Endl;
  52. return *this;
  53. }
  54. private:
  55. void DoWrite(const void* buf, size_t len) override final;
  56. void DoFlush() override;
  57. private:
  58. IOutputStream& Slave_;
  59. bool WasNL_;
  60. const char Delim_;
  61. const bool QuoteItems_;
  62. };
  63. } // namspace NUtils
  64. } // namspace NYql