mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 11:30:18 +00:00
add csv
module
This commit is contained in:
parent
7b9c7d926d
commit
a62943568f
@ -9,7 +9,7 @@ pipeline = [
|
|||||||
["config.h", "export.h", "common.h", "memory.h", "vector.h", "str.h", "tuplelist.h", "namedict.h", "error.h", "lexer.h"],
|
["config.h", "export.h", "common.h", "memory.h", "vector.h", "str.h", "tuplelist.h", "namedict.h", "error.h", "lexer.h"],
|
||||||
["obj.h", "dict.h", "codeobject.h", "frame.h"],
|
["obj.h", "dict.h", "codeobject.h", "frame.h"],
|
||||||
["gc.h", "vm.h", "ceval.h", "expr.h", "compiler.h", "repl.h"],
|
["gc.h", "vm.h", "ceval.h", "expr.h", "compiler.h", "repl.h"],
|
||||||
["_generated.h", "cffi.h", "bindings.h", "iter.h", "base64.h", "collections.h", "random.h", "re.h", "linalg.h", "easing.h", "io.h"],
|
["_generated.h", "cffi.h", "bindings.h", "iter.h", "base64.h", "csv.h", "collections.h", "random.h", "re.h", "linalg.h", "easing.h", "io.h"],
|
||||||
["pocketpy.h", "pocketpy_c.h"]
|
["pocketpy.h", "pocketpy_c.h"]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
25
docs/modules/csv.md
Normal file
25
docs/modules/csv.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
---
|
||||||
|
icon: package
|
||||||
|
label: csv
|
||||||
|
---
|
||||||
|
|
||||||
|
### `csv.reader(csvfile: list[str]) -> list`
|
||||||
|
|
||||||
|
Parse a CSV file into a list of lists.
|
||||||
|
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```python
|
||||||
|
import csv
|
||||||
|
|
||||||
|
data = """a,b,c
|
||||||
|
1,2,3
|
||||||
|
"""
|
||||||
|
|
||||||
|
print(csv.reader(data.splitlines()))
|
||||||
|
# [
|
||||||
|
# ['a', 'b', 'c'],
|
||||||
|
# ['1', '2', '3']
|
||||||
|
# ]
|
||||||
|
```
|
9
include/pocketpy/csv.h
Normal file
9
include/pocketpy/csv.h
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "cffi.h"
|
||||||
|
|
||||||
|
namespace pkpy {
|
||||||
|
|
||||||
|
void add_module_csv(VM* vm);
|
||||||
|
|
||||||
|
} // namespace pkpy
|
@ -14,6 +14,7 @@
|
|||||||
#include "random.h"
|
#include "random.h"
|
||||||
#include "bindings.h"
|
#include "bindings.h"
|
||||||
#include "collections.h"
|
#include "collections.h"
|
||||||
|
#include "csv.h"
|
||||||
|
|
||||||
namespace pkpy {
|
namespace pkpy {
|
||||||
|
|
||||||
|
56
src/csv.cpp
Normal file
56
src/csv.cpp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "pocketpy/csv.h"
|
||||||
|
#include "pocketpy/config.h"
|
||||||
|
|
||||||
|
namespace pkpy{
|
||||||
|
|
||||||
|
void add_module_csv(VM *vm){
|
||||||
|
PyObject* mod = vm->new_module("csv");
|
||||||
|
|
||||||
|
vm->bind(mod, "reader(csvfile: list[str]) -> list", [](VM* vm, ArgsView args){
|
||||||
|
const List& csvfile = CAST(List&, args[0]);
|
||||||
|
List ret;
|
||||||
|
for(int i=0; i<csvfile.size(); i++){
|
||||||
|
std::string_view line = CAST(Str&, csvfile[i]).sv();
|
||||||
|
List row;
|
||||||
|
int j = 0;
|
||||||
|
bool in_quote = false;
|
||||||
|
std::string buffer;
|
||||||
|
while(j < line.size()){
|
||||||
|
switch(line[j]){
|
||||||
|
case '"':
|
||||||
|
if(in_quote){
|
||||||
|
if(j+1 < line.size() && line[j+1] == '"'){
|
||||||
|
buffer += '"';
|
||||||
|
j++;
|
||||||
|
}else{
|
||||||
|
in_quote = false;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
in_quote = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ',':
|
||||||
|
if(in_quote){
|
||||||
|
buffer += line[j];
|
||||||
|
}else{
|
||||||
|
row.push_back(VAR(buffer));
|
||||||
|
buffer.clear();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
buffer += line[j];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
if(in_quote){
|
||||||
|
vm->ValueError("unterminated quote");
|
||||||
|
}
|
||||||
|
row.push_back(VAR(buffer));
|
||||||
|
ret.push_back(VAR(std::move(row)));
|
||||||
|
}
|
||||||
|
return VAR(std::move(ret));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace pkpy
|
@ -549,6 +549,15 @@ void init_builtins(VM* _vm) {
|
|||||||
return VAR(std::move(ret));
|
return VAR(std::move(ret));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
_vm->bind(_vm->_t(_vm->tp_str), "splitlines(self)", [](VM* vm, ArgsView args) {
|
||||||
|
const Str& self = _CAST(Str&, args[0]);
|
||||||
|
std::vector<std::string_view> parts;
|
||||||
|
parts = self.split('\n');
|
||||||
|
List ret(parts.size());
|
||||||
|
for(int i=0; i<parts.size(); i++) ret[i] = VAR(Str(parts[i]));
|
||||||
|
return VAR(std::move(ret));
|
||||||
|
});
|
||||||
|
|
||||||
_vm->bind(_vm->_t(_vm->tp_str), "count(self, s: str)", [](VM* vm, ArgsView args) {
|
_vm->bind(_vm->_t(_vm->tp_str), "count(self, s: str)", [](VM* vm, ArgsView args) {
|
||||||
const Str& self = _CAST(Str&, args[0]);
|
const Str& self = _CAST(Str&, args[0]);
|
||||||
const Str& s = CAST(Str&, args[1]);
|
const Str& s = CAST(Str&, args[1]);
|
||||||
@ -1646,6 +1655,7 @@ void VM::post_init(){
|
|||||||
add_module_base64(this);
|
add_module_base64(this);
|
||||||
add_module_timeit(this);
|
add_module_timeit(this);
|
||||||
add_module_operator(this);
|
add_module_operator(this);
|
||||||
|
add_module_csv(this);
|
||||||
|
|
||||||
for(const char* name: {"this", "functools", "heapq", "bisect", "pickle", "_long", "colorsys", "typing", "datetime"}){
|
for(const char* name: {"this", "functools", "heapq", "bisect", "pickle", "_long", "colorsys", "typing", "datetime"}){
|
||||||
_lazy_modules[name] = kPythonLibs[name];
|
_lazy_modules[name] = kPythonLibs[name];
|
||||||
|
28
tests/80_csv.py
Normal file
28
tests/80_csv.py
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import csv
|
||||||
|
def test(data: str, expected):
|
||||||
|
ret = list(csv.reader(data.splitlines()))
|
||||||
|
assert ret==expected, f"Expected {expected}, got {ret}"
|
||||||
|
|
||||||
|
test("""a,b,c
|
||||||
|
1,2,3
|
||||||
|
""", [['a', 'b', 'c'], ['1', '2', '3']])
|
||||||
|
|
||||||
|
test("""a,b,c
|
||||||
|
1,2,"3"
|
||||||
|
""", [['a', 'b', 'c'], ['1', '2', '3']])
|
||||||
|
|
||||||
|
test("""a,b,c
|
||||||
|
1,2,'3'
|
||||||
|
""", [['a', 'b', 'c'], ['1', '2', '\'3\'']])
|
||||||
|
|
||||||
|
test('''a,b,c
|
||||||
|
1,2,"123"""
|
||||||
|
''', [['a', 'b', 'c'], ['1', '2', '123"']])
|
||||||
|
|
||||||
|
test("""a,b,c,
|
||||||
|
1,2,3,
|
||||||
|
""", [['a', 'b', 'c', ''], ['1', '2', '3', '']])
|
||||||
|
|
||||||
|
test("""a,b ,c,
|
||||||
|
1,"22""33",3
|
||||||
|
""", [['a', 'b ', 'c', ''], ['1', '22"33', '3']])
|
Loading…
x
Reference in New Issue
Block a user