1. 程式人生 > >【clisp】實現讀取CSV檔案

【clisp】實現讀取CSV檔案

csv檔案:

             1、每行資料集各元素以逗號間隔

             2、若單元素中有逗號,則整個元素以雙引號括起來為一個單元素

             3、若雙引號元素中又有雙引號,則需要轉義雙引號為 \"

以clisp為例實現 csv 檔案讀取,實現如下:

read-csv-file: 可以直接讀取一個csv檔案,並以列表形式返回資料。

split-csv-line: 可以處理單行資料集,並返回列表形式資料集;所有元素都預設為string

;;;; WHJ.20180827 read csv file
;;;; WHJ.20180831 完善

(defpackage :WHJ.CSV
     (:use :cl :charset :cl-ppcre)
     (:export
         :split-csv-line
         :read-csv-file))

(in-package :WHJ.CSV)

(defun next-f1 (str str-len idx)
     (let ((s (search "," str :start2 idx)))
         (if s s str-len)))
(defun next-end (str slen idx)
         (unless (< idx slen) (return-from next-end slen))

        (if (char= (char str idx) #\");以"開頭
            (unless
                (do* ((i (1+ idx))
                       (ch (char str i) (char str i))
                       (nextch (if (< (1+ i) slen) (char str (1+ i)) nil) (if (< (1+ i) slen) (char str (1+ i)) nil)))
                      ((null nextch))

                     ;(format t "i=~a ch=~a nch=~a~%" i ch nextch)
                      
                      (if (and (char= ch #\") (char= nextch ch)) 
                         (incf i 2)
                         (if (char= ch #\")
                             (return-from next-end (next-f1 str slen i))
                             (incf i))))
                slen)
             (let ((ch (char str idx)));可能為多個空的值,例str = ",,,,"
                  (if (char= ch #\,)
                      idx
                      (next-f1 str slen (1+ idx))))))
(defun split-csv-line (str)     
     (let ((len (length str)))
         (append
             (loop for s = 0 then (1+ e)
                   for e = (next-end str len 0) then (next-end str len s)
                   while (< s len)
                     collect (let ((sublen (- e s))
                                   (substr (subseq str s e)))
                                  (if (and (plusp sublen) (char= (char substr 0) #\"))
                                       (setf substr (subseq substr 1 (1- sublen))))
                                   (regex-replace-all "\"\"" substr "\"")))
             (if (char= (char str (1- len)) #\,) (list "") nil))))
             
 (defun read-csv-file (file &optional (charset charset:gbk))
     (mapcar #'split-csv-line
             (with-open-file (in file :external-format charset)
                 (loop for x = (read-line in nil)
                     while x
                         collect x))))

相關推薦

clisp實現讀取CSV檔案

csv檔案:              1、每行資料集各元素以逗號間隔              2、若單元素中有逗號,則整個元素以雙引號括起來為一個單元素              3、若雙引號元素中又有雙引號,則需要轉義雙引號為 \" 以clisp為例實現 csv

120TensorFlow 從CSV檔案讀取資料並訓練線性迴歸模型(面向新手)

正文開始。 學習 TensorFlow 讓我的思維發生了變化。 計算機本質上是一種數學的工具,而我在學習程式設計的時候,思維也不可避免地收到了影響。傳統的程式設計思想,常常認為程式就應該像數學定理或者數學函式一樣,給出一個確定的結果。這是一種基於邏輯推導

UE4學習15_UE4讀取CSV檔案並使用

2017.2.23補: 環境:win10 64bitUE 4.15 —————————————————————————————— 1.建立表格匯出csv格式的檔案(漢字記得uft-8格式);建立與表格

java 一個讀取配置檔案的類

/** * <p>Title:InitConfig.java</p> * <p>Description:</p> * @author songrongkai * @date 2018年7月29日 * @version 1.0 */ p

C++讀寫CSV檔案

新建CSV檔案:建txt——另存(UTF-8)——字尾.csv CSVparser.hpp #ifndef _CSVPARSER_HPP_ # define _CSVPARSER_HPP_ # include <stdexcept>

Python實現網站備份檔案掃描+原始碼分析

一開始我用的requests庫的get方法 但是這種方法會自動下載檔案,所以不可取 後來發現urllib2的庫相對來說不錯 原始碼如下# coding = utf-8 import urllib2 i

SpringBoot——SpringBoot 讀取配置檔案方式

// 方式一: 將配置檔案封裝為一個bean @Autowired private ConfigProps configProps; // 方式二: 通過 Spring 提供的類獲取配置檔案 @Autowired private Environment environmen

RpackagereadrR讀取帶分隔符的csv檔案

一、R將所有資料讀取為一個變數 二、安裝readr包 install.packages("readr") library(readr) 三、讀取資料 read.delim 讀取帶分隔符的行 read_csv2(file, col_names = TRUE,

Linux下配置檔案讀取操作流程及其C程式碼實現

轉自:http://blog.csdn.net/zhouzhaoxiong1227/article/details/45563263#comments 一、概述 Linux具有免費、可靠、安全、穩定、多平臺等特點,因此深受廣大程式設計師的歡迎。 為了體現軟體產品的靈活性,可新增配置檔案存放某些重要的

Python筆記操作讀取Excel檔案、文字檔案

需求:讀取Excel檔案、替換文字檔案中得指定某個字串並生成新的檔案 原始碼: #encoding:utf-8 # -*- coding: utf-8 -*- #!/usr/bin/env python # -*- coding=utf-8 -*- #Using GPL v2 #Author:

springmvc通過POI下載檔案實現過程

通過POI下載檔案的實現過程 整體程式碼實現思路 前臺程式碼 後臺程式碼 整體程式碼實現思路 首先在jsp頁面中,設定一個匯出功能按鈕,在匯出功能函式中,通過window.location.href的方式開啟一個新的頁面;

C++C++讀取特定路徑下所有檔案//*(資料夾下的所有圖片、文件等)

內容:主要有兩種,一是藉助相關結構體,二是針對檔名排練有序。 一、藉助結構體 1.引用標頭檔案 #include <io.h> #include < fstream> #include < string> 2.適用範圍 沒有限制。

Makefile實現多個bin檔案格式化拼接成一個檔案

FILE_GRP = a1.bin a2.bin b.bin ccc.bin FILE_BAS = a_bas.bin FILE_GET_LEN = 256 FILE_ALL_TARGET = a_all.bin 輸出: ======= (0) a_all.b

Python 2.7xlrd讀取Excel檔案

這篇博文參考於《Python 資料處理》讀取Excel檔案需要用到xlrd模組,模組下載地址:xlrd下載地址下面我們使用xlrd模組提取Excel檔案中的童工和童婚比例:""" 這是用來分析童工和童婚

Jmeter解決從csv引數檔案中獲取帶引號/逗號的資料問題

原文:【jmeter隨筆(3)-從csv中獲取帶引號的資料詳情】  點選檢視原文 作者:黑夜小怪 軟體測試技術交流群 : 429183023  最近在工作中,對jmeter實踐的點滴的記錄這裡分享,不一定正確,僅供參考和討論,有想法的歡迎留言、談論。 1技巧

PythonPython讀取資料夾下的所有檔案

 os.listdir(path)是得到在path路徑下所以檔案的名稱列表。     open(path)是開啟某個檔案。    iter是python的迭代器。        所以讀取某資料夾下的所

tensorflow:簡單的讀取CSV檔案,並實現分批操作

import numpy as np from tensorflow.contrib.learn.python.learn.datasets import base filename = "SiteBUDP_test_label.csv" test = base.loa

JAVAapache poi excel 檔案讀取,各種資料型別,不規則excel格式都可以讀取

本文將通過例項來介紹apache poi  讀取excel的原理,包括各種資料型別的處理,本文提供的程式碼非常通用,即使不規則的excel檔案,也可以讀取。 直接看程式碼吧 package poi.excel; import java.io.File; import j

JDBC實現JDBC實現銀行的轉賬事務

str package b- exceptio hide use play key rgs JDBC中的事務是默認提交的,也就是說每執行一次PreparedStatement,那麽數據就會被寫入到磁盤。如果需要關閉默認提交,使用 void setAutoCommit(fa

對js操作html的實踐1——實現網頁假崩潰吸引網友註意力

code 自己 頁面 註意力 size mat pre fun hidden 前些天逛網站的時候,發現了一些好玩的細節:當網頁失去焦點後標題顯示網頁崩潰,這將使得瀏覽者重新點回網頁。 來自ANOTHERHOME(https://www.anotherhome.net/)與晨