mirror of
https://github.com/red0124/ssp.git
synced 2025-12-14 21:59:55 +01:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 99725f48b7 | |||
| c097732352 | |||
| 8b1cf56549 | |||
| 50de5b3a5a | |||
|
|
f4bca3915f | ||
| 809939d0e2 | |||
| b9f4afdd5f | |||
|
|
69875c238e | ||
|
|
457defadaa |
6
.github/workflows/macos-apple-clang.yml
vendored
6
.github/workflows/macos-apple-clang.yml
vendored
@@ -25,10 +25,10 @@ jobs:
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
xcode: ['15.2']
|
||||
xcode: ['13.4.1', '14.1']
|
||||
type: [Release, Debug]
|
||||
|
||||
runs-on: macos-latest
|
||||
runs-on: macos-12
|
||||
|
||||
env:
|
||||
DEVELOPER_DIR: /Applications/Xcode_${{matrix.xcode}}.app/Contents/Developer
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
id: cores
|
||||
|
||||
- name: Install dependencies
|
||||
run: script/ci_install_deps.sh sudo
|
||||
run: script/ci_install_deps.sh
|
||||
|
||||
- name: Configure
|
||||
run: cmake -S test -B build -DCMAKE_BUILD_TYPE=${{matrix.type}}
|
||||
|
||||
77
.github/workflows/ubuntu-latest-icc.yml
vendored
Normal file
77
.github/workflows/ubuntu-latest-icc.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
name: ubuntu-latest-icc-ci
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- feature/**
|
||||
- improvement/**
|
||||
- bugfix/**
|
||||
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- feature/**
|
||||
- improvement/**
|
||||
- bugfix/**
|
||||
|
||||
env:
|
||||
LINUX_BASEKIT_URL: https://registrationcenter-download.intel.com/akdlm/irc_nas/17431/l_BaseKit_p_2021.1.0.2659_offline.sh
|
||||
LINUX_HPCKIT_URL:
|
||||
https://registrationcenter-download.intel.com/akdlm/irc_nas/17427/l_HPCKit_p_2021.1.0.2684_offline.sh
|
||||
|
||||
jobs:
|
||||
icc_tests:
|
||||
if: >-
|
||||
! contains(toJSON(github.event.commits.*.message), '[skip ci]') &&
|
||||
! contains(toJSON(github.event.commits.*.message), '[skip github]')
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
defaults:
|
||||
run:
|
||||
shell: bash
|
||||
|
||||
container:
|
||||
image: gcc:10
|
||||
options: -v /usr/local:/host_usr_local
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: cache install
|
||||
id: cache-install
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: |
|
||||
/opt/intel/oneapi/compiler
|
||||
key: >-
|
||||
install-${{env.LINUX_HPCKIT_URL}}-
|
||||
${{env.LINUX_CPP_COMPONENTS_WEB}}-
|
||||
compiler-${{hashFiles('**/scripts/cache_exclude_linux.sh')}}
|
||||
|
||||
- name: Install icc
|
||||
run: >-
|
||||
script/ci_install_icc.sh $LINUX_HPCKIT_URL $LINUX_CPP_COMPONENTS_WEB
|
||||
|
||||
- name: CMake
|
||||
run: echo "/host_usr_local/bin" >> $GITHUB_PATH
|
||||
|
||||
- name: Install dependencies
|
||||
run: script/ci_install_deps.sh
|
||||
|
||||
- name: Configure
|
||||
run: >-
|
||||
source script/ci_setup_icc.sh &&
|
||||
cmake -S test -B build -D CMAKE_BUILD_TYPE=Debug
|
||||
|
||||
- name: Build
|
||||
run: >-
|
||||
source script/ci_setup_icc.sh &&
|
||||
cmake --build build -j ${{steps.cores.outputs.count}}
|
||||
|
||||
- name: Run
|
||||
working-directory: build
|
||||
run: ctest --output-on-failure
|
||||
5
.github/workflows/win-msvc.yml
vendored
5
.github/workflows/win-msvc.yml
vendored
@@ -31,11 +31,14 @@ jobs:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
config:
|
||||
- os: windows-2019
|
||||
vs: "Visual Studio 16 2019"
|
||||
|
||||
- os: windows-latest
|
||||
vs: "Visual Studio 17 2022"
|
||||
|
||||
build: [Debug, Release]
|
||||
platform: [x64]
|
||||
platform: [Win32, x64]
|
||||
|
||||
runs-on: ${{matrix.config.os}}
|
||||
|
||||
|
||||
7
.github/workflows/win-msys2-clang.yml
vendored
7
.github/workflows/win-msys2-clang.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
fail-fast: false
|
||||
|
||||
matrix:
|
||||
os: [windows-2025, windows-latest]
|
||||
os: [windows-2019, windows-latest]
|
||||
type: [Release, Debug]
|
||||
config:
|
||||
- msystem: "MINGW64"
|
||||
@@ -39,6 +39,11 @@ jobs:
|
||||
git mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja
|
||||
mingw-w64-x86_64-clang
|
||||
|
||||
- msystem: "MINGW32"
|
||||
install: >-
|
||||
git mingw-w64-i686-cmake mingw-w64-i686-ninja
|
||||
mingw-w64-i686-clang
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
name: "${{matrix.config.msystem}}: ${{matrix.os}}: ${{matrix.type}}"
|
||||
|
||||
7
.github/workflows/win-msys2-gcc.yml
vendored
7
.github/workflows/win-msys2-gcc.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
fail-fast: false
|
||||
|
||||
matrix:
|
||||
os: [windows-2025, windows-latest]
|
||||
os: [windows-2019, windows-latest]
|
||||
type: [Release, Debug]
|
||||
config:
|
||||
- msystem: "MINGW64"
|
||||
@@ -39,6 +39,11 @@ jobs:
|
||||
git mingw-w64-x86_64-cmake mingw-w64-x86_64-ninja
|
||||
mingw-w64-x86_64-gcc
|
||||
|
||||
- msystem: "MINGW32"
|
||||
install: >-
|
||||
git mingw-w64-i686-cmake mingw-w64-i686-ninja
|
||||
mingw-w64-i686-gcc
|
||||
|
||||
runs-on: ${{matrix.os}}
|
||||
|
||||
name: "${{matrix.config.msystem}}: ${{matrix.os}}: ${{matrix.type}}"
|
||||
|
||||
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.14)
|
||||
|
||||
project(
|
||||
ssp
|
||||
VERSION 1.8.0
|
||||
VERSION 1.7.2
|
||||
DESCRIPTION "csv parser"
|
||||
HOMEPAGE_URL "https://github.com/red0124/ssp"
|
||||
LANGUAGES CXX
|
||||
|
||||
57
README.md
57
README.md
@@ -9,14 +9,15 @@
|
||||
|
||||
[](https://opensource.org/licenses/MIT)
|
||||
[](https://coveralls.io/github/red0124/ssp?branch=master)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/fuzz.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/single-header.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/ubuntu-latest-gcc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/ubuntu-latest-clang.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msys2-gcc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msys2-clang.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msvc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/macos-apple-clang.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/fuzz.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/single-header.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/ubuntu-latest-gcc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/ubuntu-latest-clang.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/ubuntu-latest-icc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msys2-gcc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msys2-clang.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/win-msvc.yml)
|
||||
[](https://github.com/red0124/ssp/actions/workflows/macos-apple-clang.yml)
|
||||
|
||||
A header only CSV parser which is fast and versatile with modern C++ API. Requires compiler with C++17 support. [Can also be used to efficiently convert strings to specific types.](#the-converter)
|
||||
|
||||
@@ -73,7 +74,7 @@ Bill (Heath) Gates 65 3.3
|
||||
|
||||
# Single header
|
||||
|
||||
The library can be used with a single header file **`ssp.hpp`**, but it suffers a significant performance loss when converting floating point values since the **`fast_float`** library is not present within the file.
|
||||
The library can be used with a single header file **`ssp.hpp`**, but it suffers a slight performance loss when converting floating point values since the **`fast_float`** library is not present within the file.
|
||||
|
||||
# Installation
|
||||
|
||||
@@ -91,7 +92,7 @@ The library supports [CMake](#Cmake) and [meson](#Meson) build systems
|
||||
|
||||
## Headers
|
||||
|
||||
The parser can be told to use only certain columns by parsing the header. This can be done with the **`use_fields`** method. It accepts any number of string-like arguments or even an **`std::vector<std::string>`** with the field names. If any of the fields are not found within the header or if any fields are defined multiple times it will result in an error.
|
||||
The parser can be told to use only certain columns by parsing the header. This can be done by using the **`use_fields`** method. It accepts any number of string-like arguments or even an **`std::vector<std::string>`** with the field names. If any of the fields are not found within the header or if any fields are defined multiple times it will result in an error.
|
||||
```shell
|
||||
$ cat students_with_header.csv
|
||||
Id,Age,Grade
|
||||
@@ -115,7 +116,7 @@ James Bailey 2.5
|
||||
Brian S. Wolfe 1.9
|
||||
Bill (Heath) Gates 3.3
|
||||
```
|
||||
The header can be ignored using the **`ss::ignore_header`** [setup](#Setup) option or by calling the **`ignore_next`** method after the parser has been constructed. If the header has been ignored calling any method related to header usage will result in a compilation error.
|
||||
The header can be ignored using the **`ss::ignore_header`** [setup](#Setup) option or by calling the **`ignore_next`** method after the parser has been constructed.
|
||||
```cpp
|
||||
ss::parser<ss::ignore_header> p{file_name};
|
||||
```
|
||||
@@ -123,10 +124,10 @@ The fields with which the parser works with can be modified at any given time. T
|
||||
```cpp
|
||||
// ...
|
||||
ss::parser<ss::throw_on_error> p{"students_with_header.csv"};
|
||||
p.use_fields("Grade");
|
||||
p.use_fields("Id", "Grade");
|
||||
|
||||
const auto& grade = p.get_next<std::string>();
|
||||
std::cout << grade << std::endl;
|
||||
const auto& [id, grade] = p.get_next<std::string, float>();
|
||||
std::cout << id << ' ' << grade << std::endl;
|
||||
|
||||
if (p.field_exists("Id")) {
|
||||
p.use_fields("Grade", "Id");
|
||||
@@ -138,32 +139,10 @@ The fields with which the parser works with can be modified at any given time. T
|
||||
```
|
||||
```shell
|
||||
$ ./a.out
|
||||
2.5
|
||||
1.9 Brian S. Wolfe
|
||||
3.3 Bill (Heath) Gates
|
||||
James Bailey 2.5
|
||||
40 Brian S. Wolfe
|
||||
65 Bill (Heath) Gates
|
||||
```
|
||||
The header is parsed with the same rules as other rows, the only difference is that **`multiline`** will be disabled when parsing the header. To get the data that is
|
||||
present in the header as a **`std::vector<std::string>`**, the **`header`** method can be used, and to get the header line before it has been parsed, the **`raw_header`** method can be used:
|
||||
```cpp
|
||||
// ...
|
||||
ss::parser<ss::throw_on_error> p{"students_with_header.csv"};
|
||||
|
||||
std::cout << p.raw_header() << std::endl;
|
||||
|
||||
for (const auto& field: p.header()) {
|
||||
std::cout << "> " << field << std::endl;
|
||||
}
|
||||
// ...
|
||||
```
|
||||
```shell
|
||||
$ ./a.out
|
||||
Id,Age,Grade
|
||||
> Id
|
||||
> Age
|
||||
> Grade
|
||||
```
|
||||
Methods related to headers can also fail, the error handling of these is done in the same way as for other methods.
|
||||
|
||||
## Conversions
|
||||
An alternate loop to the example above would look like:
|
||||
```cpp
|
||||
|
||||
@@ -6,7 +6,7 @@ project(
|
||||
'cpp_std=c++17',
|
||||
'buildtype=debugoptimized',
|
||||
'wrap_mode=forcefallback'],
|
||||
version: '1.8.0',
|
||||
version: '1.7.2',
|
||||
meson_version:'>=0.54.0')
|
||||
|
||||
fast_float_dep = dependency('fast_float')
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
#!/bin/bash
|
||||
|
||||
JOBS=4
|
||||
BUILD_TYPE=Debug
|
||||
|
||||
set -ex
|
||||
set -eux
|
||||
|
||||
git clone https://github.com/red0124/doctest -b master --depth 1
|
||||
|
||||
@@ -12,10 +12,6 @@ cmake -S doctest -B doctest/build \
|
||||
-D DOCTEST_WITH_MAIN_IN_STATIC_LIB=NO \
|
||||
-D DOCTEST_WITH_TESTS=NO
|
||||
|
||||
if [[ "${1}" == "sudo" ]]; then
|
||||
sudo cmake --build doctest/build --config ${BUILD_TYPE} --target install -j ${JOBS}
|
||||
else
|
||||
cmake --build doctest/build --config ${BUILD_TYPE} --target install -j ${JOBS}
|
||||
fi
|
||||
cmake --build doctest/build --config ${BUILD_TYPE} --target install -j ${JOBS}
|
||||
|
||||
rm -rf doctest
|
||||
|
||||
23
script/ci_install_icc.sh
Executable file
23
script/ci_install_icc.sh
Executable file
@@ -0,0 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SPDX-FileCopyrightText: 2020 Intel Corporation
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
URL=$1
|
||||
COMPONENTS=$2
|
||||
|
||||
curl --output webimage.sh --url "$URL" --retry 5 --retry-delay 5
|
||||
chmod +x webimage.sh
|
||||
./webimage.sh -x -f webimage_extracted --log extract.log
|
||||
rm -rf webimage.sh
|
||||
WEBIMAGE_NAME=$(ls -1 webimage_extracted/)
|
||||
if [ -z "$COMPONENTS" ]; then
|
||||
webimage_extracted/"$WEBIMAGE_NAME"/bootstrapper -s --action install --eula=accept --continue-with-optional-error=yes --log-dir=.
|
||||
installer_exit_code=$?
|
||||
else
|
||||
webimage_extracted/"$WEBIMAGE_NAME"/bootstrapper -s --action install --components="$COMPONENTS" --eula=accept --continue-with-optional-error=yes --log-dir=.
|
||||
installer_exit_code=$?
|
||||
fi
|
||||
rm -rf webimage_extracted
|
||||
exit $installer_exit_code
|
||||
11
script/ci_setup_icc.sh
Executable file
11
script/ci_setup_icc.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/bin/bash
|
||||
|
||||
# SPDX-FileCopyrightText: 2020 Intel Corporation
|
||||
#
|
||||
# SPDX-License-Identifier: MIT
|
||||
|
||||
#shellcheck disable=SC2010
|
||||
LATEST_VERSION=$(ls -1 /opt/intel/oneapi/compiler/ | grep -v latest | sort | tail -1)
|
||||
# shellcheck source=/dev/null
|
||||
source /opt/intel/oneapi/compiler/"$LATEST_VERSION"/env/vars.sh
|
||||
CXX=dpcpp
|
||||
Reference in New Issue
Block a user