我正試圖從一個FTP轉儲中讀取一堆.csv檔案,我想將其加載到我們的SQL服務器。然而,當我試圖這樣做時,我得到了很多壞行的錯誤。我縮小了問題的范圍,它似乎發生在字串引號不良的行中。
示例csv-data:
"問題前的列", "隨機字串 "更多字串",字串的最后部分", "問題后的列"
資料是這樣輸入的,是一種空氣引語--所以現實生活中的資料可能看起來像:
"這個人患有 "例外食欲",這導致他們吃得很多"我正在使用的代碼是:
"這個人患有 "例外食欲",這導致他們吃得很多。
我正在使用的代碼:
ch = pd.read_csv(file,
chunksize=100000,
low_memory=False。
quotechar='"'。
encoding="iso-8859-1")
df = pd.concat(chunk)
我試著用和不用quotechar引數來閱讀。
編輯1:添加了csv檔案的圖片 產生問題的一個csv檔案的部分圖片
編輯2:在文本中添加了csv檔案,洗掉了結尾的空列
。"REDACTED","REDACTED","REDACTED","REDACTED","F",08/05/2014,"10:00:00","BB",30,"2050","REDACTED",0,0,"U",0,
"REDACTED", "REDACTED", "REDACTED", "F",03/10/2014, "13:30:00", "BB",30, "2050", "Doesnt want BEH, only us, because she is not "gameready", therefore just 1/2 hours",0,0, "U",0。
編輯3:在文本中添加了帶有空欄位的csv檔案:
klinik_id,firma_id,patientid,ds_cpr,ds_sex,ds_dato, ds_klokke,ds_behandl,ds_varighe,ds_status,ds_beskrivelse,ds_aktiv,ds_stamp,ds_atype,ds_forsink,bit1,bit2,bit3,bit4,bit5,bit6, bit7,bit8,bit9,bit10,bit11,bit12,bit13,bit14,bit15,bit16,bit17,bit18,bit19,bit20,bit21,bit22,bit23,bit24,bit25,bit26,bit27,bit28,bit29,bit30,bit31,bit32,bit33,bit34,bit35,bit36,bit37,bit38,bit39,bit40,bit41,bit42,bit43,bit44,bit45,bit46,bit47,bit48
"REDACTED","REDACTED","REDACTED","REDACTED","F",08/05/2014,"10:00: 00", "bb",30, "2050", "redacted",0,0, "u",0," ", "j"," "," "," "," "," "," ", "j"," "," "," "," "," "," "," "," "," "," ",
"REDACTED","REDACTED","REDACTED","REDACTED","F",03/10/2014,"13:30: 00", "BB",30, "2050", "Doesnt want BEH, only us, because she is not "gameready", therefore just 1/2 hours",0,0, "U",0," ", "J"," "," "," "," "," "J"," "," "," "," "。
編輯4:資料框架資訊列印樣本,上面有4行:
資料列(共79列)。
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 klinik_id 4 非空物件
1 firma_id 4個非空的int64
2 patientid 4個非空的int64
3 ds_cpr 4 non-null int64
4 ds_sex 4 非空物件
5 ds_dato 4 非空值物件
6 ds_klokke 4 非空物件
7 ds_behandl 4 非空物件
8 ds_varighe 4 非空的int64物件
9 ds_status 4個非空的int64
10 ds_beskrivelse 4 非空物件
11 ds_aktiv 4個非空的int64
12 ds_stamp 4個非空的int64
13 ds_atype 4 非空物件
14 ds_forsink 4 非空值 int64
15 bit1 4個非空物件
16 bit2 4個非空物件
17 bit3 4個非空物件
18 bit4 4個非空物件
19 bit5 4個非空物件
20 bit6 4個非空物件
21 bit7 4個非空物件
22 bit8 4個非空物件
23 bit9 4個非空物件
24 bit10 4個非空物件
25 bit11 4個非空物件
26 bit12 4個非空物件
27 bit13 4個非空物件
28 bit14 4個非空物件
29 bit15 4個非空物件
30 bit16 4個非空物件
31 bit17 4個非空物件
32 bit18 4個非空物件
33 bit19 4個非空物件
34 bit20 4個非空物件
35 bit21 4個非空物件
36 bit22 4個非空物件
37 bit23 4個非空物件
38 bit24 4個非空物件
39 bit25 4個非空物件
40 bit26 4個非空物件
41 bit27 4個非空物件
42 bit28 4個非空物件
43 bit29 4個非空物件
44 bit30 4個非空物件
45 bit31 4個非空物件
46 bit32 4個非空物件
47 bit33 4個非空物件
48 bit34 4個非空物件
49 bit35 4個非空物件
50 bit36 4個非空物件
51 bit37 4個非空物件
52 bit38 4個非空物件
53 bit39 4個非空物件
54 bit40 4個非空物件
55 bit41 4個非空物件
56 bit42 4個非空物件
57 bit43 4個非空物件
58 bit44 4個非空物件
59 bit45 4個非空物件
60 bit46 4個非空物件
61 bit47 4個非空物件
62 bit48 4個非空物件
63 bit49 4個非空物件
64 bit50 4個非空物件
65 bit51 4個非空物件
66 bit52 4個非空物件
67 bit53 4個非空物件
68 bit54 4個非空物件
69 bit55 4個非空物件
70 bit56 4個非空物件
71 bit57 4個非空物件
72 bit58 4個非空物件
73 bit59 4個非空物件
74 bit60 4個非空物件
75 bit61 4個非空物件
76 bit62 4個非空物件
77 bit63 4個非空物件
78 bit64 4個非空物件
dtypes: int64(8), object(71)
uj5u.com熱心網友回復:
選項quotechar的結果是忽略了參考部分的分隔符,所以它進入了單列。如果你的檔案有正確的分隔符,只需讀取它并替換引號:
df = pd.read_csv(file).replace('" ',', regex=True)
uj5u.com熱心網友回復:
由于只有一個格式不好的欄位,一種方法是接受到它為止的所有欄位,并從最后倒退到所有正確的欄位,然后將所有剩余的欄位連接起來。
import pandas as pd
import csv
資料 = []
with open('input.csv') as F_input:
csv_input = csv.reader(f_input)
columns = next(csv_input) [f'bit{n}' for n in range(49, 65)]
for row in csv_input:
comment = ''.join(row[10:-68]).replace('", '')
data.append([*row[:10], comment, *row[-68:]] )
df = pd.DataFrame(data, columns=columns)
print(df)
對于你的例子3行CSV,這將顯示:
klinik_id firma_id patientid ds_cpr ds_sex ds_dato ds_klokke ds_behandl ds_varighe ds_status ds_beskrivelse ds_aktiv ds_stamp ds_atype ds_forsink bit1 bit2 bit3 bit4 bit5 bit6 bit7 bit8 bit9 bit10 bit11 bit12 bit13 bit14 bit15 bit16 bit17 bit18 bit19 bit20 bit21 bit22 bit23 bit24 bit25 bit26 bit27 bit28 bit29 bit30 bit31 bit32 bit33 bit34 bit35 bit36 bit37 bit38 bit39 bit40 bit41 bit42 bit43 bit44 bit45 bit46 bit47 bit48 bit49 bit50 bit51 bit52 bit53 bit54 bit55 bit56 bit57 bit58 bit59 bit60 bit61 bit62 bit63 bit64
0 刪減 刪減 刪減 刪減 f 08/05/2014 10:00:00 bb 30 2050 刪減 0 0 u 0 j j
1 REDACTED REDACTED REDACTED REDACTED F 03/10/2014 13:30:00 BB 30 2050 不想要BEH,只想要我們,因為她還沒有做好游戲準備,所以只需要1/2小時就可以了 0 0 U 0 J J
這取決于它需要多精確。這種方法將失去評論欄中的額外引號。
注意:資料中似乎有79列,但例子中的標題只顯示63列?該代碼可選擇添加缺少的bit49到bit64列(如果不需要,請洗掉)
uj5u.com熱心網友回復:
這是相當麻煩的,但就我所知,它確實解決了這個問題。也許有更干凈/更整潔的方法來做這件事,而且我毫不懷疑SO的學者們會很高興地指出這一點,但無論如何,這里是:-
import pandas as pd
import io
DQ = '"'"'"/span>
COMMA = ' ,'
def fixCol(line, s, e=None)。
nl = line[s:e].strip() if e else line[s:].strip()
if nl[0:1] == DQ and nl.count(DQ) == 4:
return DQ nl[1:].replace(DQ, SQ, 2)
return nl
with open('test.csv') as csv。
F = []
for k, line in enumerate(csv.readlines())。
if k == 0:
F.append(line) # headers
繼續: F.append(line)
T = []
s = q =0
for i in range(len(line)):
if q % 2 == 0 and line[i] == COMMA。
T.append(fixCol(line, s, i))
s = i 1
q =0
else:
if line[i] == DQ:
q = 1
if s < len(line)。
T.append(fixCol(line, s))
F.append(','.join(T))
df = pd.read_csv(io.StringIO('
'.join(F)))
print(df)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/328051.html
標籤:
下一篇:無法解決單元測驗中的引數'Volo.Abp.Identity.IIdentityRoleRepositoryroleRepository'。
