Skip to content

Commit df6ec6c

Browse files
committed
1.1.0
1 parent e6af096 commit df6ec6c

File tree

11 files changed

+438
-2422
lines changed

11 files changed

+438
-2422
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@
33
*.egg-info
44
# magic environments
55
.magic
6+
dist/*

README.me renamed to README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ My reference implementation for csv tools in mojo
44

55
### usage
66

7-
```mojo
7+
```mojo
88
from mojo_csv import CsvReader
9+
from pathlib import Path
910
10-
with open(csv_path, "r") as fi:
11-
var rd = CsvReader(fi.read())
11+
var csv_path = Path("path/to/csv/file.csv")
12+
var reader = CsvReader(csv_path)
1213
```
13-

dist/mojo_csv.mojopkg

-723 KB
Binary file not shown.

magic.lock

Lines changed: 329 additions & 2346 deletions
Large diffs are not rendered by default.

mojoproject.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ channels = ["conda-forge", "https://conda.modular.com/max"]
44
description = "csv parser in mojo"
55
name = "mojo_csv"
66
platforms = ["linux-64"]
7-
version = "0.1.1"
7+
version = "1.1.0"
88

99
[tasks]
1010
test = "mojo test.mojo test.csv"
11-
build_package = "mojo package src -o dist/mojo_csv.mojopkg"
11+
pack = "mojo package src -o dist/mojo_csv.mojopkg;cd dist; sha256sum mojo_csv.mojopkg > sha256sum.mojo_csv.mojopkg.txt"
12+
test_pack = "mojo test_pack.mojo test.csv"
1213

1314
[dependencies]
14-
max = ">=24.6.0,<25"
15+
max = ">=25.1.0,<26"

src/__init__.mojo

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
from .csv_reader import CsvReader
2-
# from .open_csv import open_csv

src/csv_reader.mojo

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from collections import Dict, List
22
from pathlib import Path, cwd
3-
from sys import argv
3+
from sys import argv, exit
4+
from testing import assert_true
45

5-
# item1,"ite,m2",item3
66

77
struct CsvReader[]:
88
# var data: Dict[String,String]
@@ -18,29 +18,30 @@ struct CsvReader[]:
1818
var row_count: Int
1919
var col_count: Int
2020

21+
2122
fn __init__(
2223
out self,
23-
# owned in_csv: Path,
24-
owned in_csv: String,
24+
owned in_csv: Path,
2525
owned delimiter: String = ",",
2626
owned quotation_mark: String = '"',
2727
):
28-
self.raw = in_csv
29-
self.length = self.raw.__len__()
30-
self.delimiter = delimiter
28+
self.raw = ""
29+
self.length = 0
3130
self.QM = quotation_mark
31+
self.delimiter = delimiter
3232
self.escape = "\\"
3333
self.CR = "\n"
3434
self.LFCR = "\r\n"
3535
self.row_count = 0
3636
self.col_count = 0
3737
self.elements = List[String]()
3838
self.headers = List[String]()
39-
self.create_reader()
39+
self._open(in_csv)
40+
self.length = self.raw.__len__()
41+
self._create_reader()
4042

4143

42-
fn create_reader(inout self):
43-
# var row_start: Int = 0
44+
fn _create_reader(mut self):
4445
var col: Int = 0
4546
var col_start: Int = 0
4647
var in_quotes: Bool = False
@@ -65,10 +66,10 @@ struct CsvReader[]:
6566
# --------
6667

6768
if char == self.delimiter:
68-
69+
6970
self.elements.append(self.raw[col_start:pos])
7071
col_start = pos + 1
71-
72+
7273
if self.row_count == 0:
7374
self.col_count += 1
7475

@@ -90,10 +91,26 @@ struct CsvReader[]:
9091
if pos + 1 < self.length:
9192
self.row_count += 1
9293
col_start = pos + 1
93-
94+
9495
elif pos == self.length:
9596
self.elements.append(self.raw[col_start:pos])
9697
# -------
9798
# -------------
99+
fn _open(mut self, in_csv: Path):
100+
try:
101+
assert_true(in_csv.exists())
102+
self.raw = in_csv.read_text()
103+
assert_true(self.raw != "")
104+
except AssertionError:
105+
print("Error opening file:", in_csv)
106+
exit()
98107

108+
# fn __copyinit__(mut self, existing: _Self) -> CsvReader:
109+
# self.raw = existing.raw
110+
# self.delimiter = existing.delimiter
111+
# self.QM = existing.QM
112+
# self.elements = existing.elements
113+
# self.col_count = existing.col_count
114+
# self.row_count = existing.row_count
115+
# return self
99116
# ---------------------

test.mojo

Lines changed: 30 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,38 @@
11
from collections import Dict, List
22
from pathlib import Path, cwd
3-
from sys import argv
3+
from sys import argv, exit
4+
from testing import assert_true
45

56
from src.csv_reader import CsvReader
6-
# from src.open_csv import open_csv
77

8-
from mojo_csv import CsvReader as CsvReaderD
8+
var VALID = List[String]("item1", "item2", '"ite,em3"',"pic"," pi c","pic","r_i_1","r_i_2","r_i_3")
99

10-
fn dist_check(read test_csv: Path):
10+
fn main() -> None:
11+
var in_csv: Path = Path(argv()[1])
12+
var rd = CsvReader(in_csv)
13+
print(in_csv)
14+
print("columns:", rd.col_count)
1115
print("----------")
1216
try:
13-
# print(in_csv)
14-
with open(test_csv, "r") as fi:
15-
var rd = CsvReaderD(fi.read())
16-
# print(rd.col_count)
17-
for x in range(len(rd.elements)):
18-
print(rd.elements[x])
19-
# -------------
20-
except Exception:
21-
print("error: ", Exception)
22-
23-
24-
25-
fn main():
26-
try:
27-
var in_csv: Path = Path(argv()[1])
28-
# print(in_csv)
29-
with open(in_csv, "r") as fi:
30-
var rd = CsvReader(fi.read())
31-
# print(rd.col_count)
32-
for x in range(len(rd.elements)):
33-
print(rd.elements[x])
34-
# -------------
35-
# var rd: CsvReader = open_csv(in_csv)
36-
# print(rd.col_count)
37-
# for x in range(len(rd.elements)):
38-
# print(rd.elements[x])
39-
dist_check(in_csv)
40-
41-
except Exception:
42-
print("error: ", Exception)
43-
44-
# def main():
45-
# in_csv = Path(argv()[1])
46-
# var rd = CsvReader(in_csv)
47-
# for x in range(len(rd.elements)):
48-
# print(rd.elements[x])
17+
for x in range(len(rd.elements)):
18+
print(rd.elements[x])
19+
assert_true(rd.elements[x] == VALID[x], String("[{0}] != expected [{1}] at index {2}").format(rd.elements[x], VALID[x], x))
20+
assert_true(len(rd.elements) == 9)
21+
except AssertionError:
22+
print(AssertionError)
23+
exit()
24+
print("----------")
25+
print("parse successful")
26+
27+
28+
# columns: 3
29+
# ----------
30+
# item1
31+
# item2
32+
# "ite,em3"
33+
# pic
34+
# pi c
35+
# pic
36+
# r_i_1
37+
# r_i_2
38+
# r_i_3

test_pack.mojo

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from collections import Dict, List
2+
from pathlib import Path, cwd
3+
from sys import argv, exit
4+
from testing import assert_true
5+
6+
from mojo_csv import CsvReader
7+
8+
var VALID = List[String]("item1", "item2", '"ite,em3"',"pic"," pi c","pic","r_i_1","r_i_2","r_i_3")
9+
10+
fn main() -> None:
11+
var in_csv: Path = Path(argv()[1])
12+
var rd = CsvReader(in_csv)
13+
print(in_csv)
14+
print("columns:", rd.col_count)
15+
print("----------")
16+
try:
17+
for x in range(len(rd.elements)):
18+
print(rd.elements[x])
19+
assert_true(rd.elements[x] == VALID[x], String("[{0}] != expected [{1}] at index {2}").format(rd.elements[x], VALID[x], x))
20+
assert_true(len(rd.elements) == 9)
21+
except AssertionError:
22+
print(AssertionError)
23+
exit()
24+
print("----------")
25+
print("parse successful")
26+
27+
28+
29+
30+
# columns: 3
31+
# ----------
32+
# item1
33+
# item2
34+
# "ite,em3"
35+
# pic
36+
# pi c
37+
# pic
38+
# r_i_1
39+
# r_i_2
40+
# r_i_3

wip/__init__.mojo

Whitespace-only changes.

0 commit comments

Comments
 (0)