Skip to content

Commit 65ae1c4

Browse files
committed
feat: add SaveJSONLines and LoadJSONLines
1 parent 86f9346 commit 65ae1c4

File tree

2 files changed

+95
-0
lines changed

2 files changed

+95
-0
lines changed

fileutil/fileutil.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,49 @@ func WriteToFileAppend(filePath string, line string) error {
162162

163163
return writer.Flush()
164164
}
165+
166+
func SaveJSONLines(filePath string, data interface{}) error {
167+
dir := filepath.Dir(filePath)
168+
if err := EnsureDir(dir); err != nil {
169+
return err
170+
}
171+
172+
file, err := os.OpenFile(filePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
173+
if err != nil {
174+
return err
175+
}
176+
defer file.Close()
177+
178+
jsonData, err := json.Marshal(data)
179+
if err != nil {
180+
return err
181+
}
182+
183+
_, err = file.Write(append(jsonData, '\n'))
184+
return err
185+
}
186+
187+
func LoadJSONLines(filePath string) ([]map[string]interface{}, error) {
188+
if !FileExists(filePath) {
189+
return nil, fmt.Errorf("file %q does not exist", filePath)
190+
}
191+
192+
file, err := os.Open(filePath)
193+
if err != nil {
194+
return nil, err
195+
}
196+
defer file.Close()
197+
198+
var results []map[string]interface{}
199+
scanner := bufio.NewScanner(file)
200+
201+
for scanner.Scan() {
202+
var item map[string]interface{}
203+
if err := json.Unmarshal(scanner.Bytes(), &item); err != nil {
204+
return nil, err
205+
}
206+
results = append(results, item)
207+
}
208+
209+
return results, scanner.Err()
210+
}

fileutil/fileutil_test.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,52 @@ func TestSerializeDeserialize(t *testing.T) {
180180
t.Errorf("DeserializeFromFile() returned incorrect data: got %+v, want %+v", readData, writeData)
181181
}
182182
}
183+
184+
func TestSaveJSONLines(t *testing.T) {
185+
// Temporary test file
186+
testFile := "test_data.jsonl"
187+
defer os.Remove(testFile)
188+
189+
data1 := map[string]interface{}{
190+
"id": "123",
191+
"name": "test1",
192+
}
193+
data2 := map[string]interface{}{
194+
"id": "456",
195+
"name": "test2",
196+
}
197+
198+
err := SaveJSONLines(testFile, data1)
199+
if err != nil {
200+
t.Fatalf("Failed to save first JSON line: %v", err)
201+
}
202+
203+
err = SaveJSONLines(testFile, data2)
204+
if err != nil {
205+
t.Fatalf("Failed to save second JSON line: %v", err)
206+
}
207+
208+
results, err := LoadJSONLines(testFile)
209+
if err != nil {
210+
t.Fatalf("Failed to load JSON lines: %v", err)
211+
}
212+
213+
if len(results) != 2 {
214+
t.Fatalf("Expected 2 entries, got %d", len(results))
215+
}
216+
217+
if results[0]["id"] != "123" || results[0]["name"] != "test1" {
218+
t.Errorf("Unexpected first entry: %v", results[0])
219+
}
220+
221+
if results[1]["id"] != "456" || results[1]["name"] != "test2" {
222+
t.Errorf("Unexpected second entry: %v", results[1])
223+
}
224+
}
225+
226+
func TestLoadJSONLines_FileNotExist(t *testing.T) {
227+
_, err := LoadJSONLines("non_existent.jsonl")
228+
if err == nil {
229+
t.Fatal("Expected an error for a non-existent file, but got nil")
230+
}
231+
}

0 commit comments

Comments
 (0)