簡體   English   中英

向后解析CSV文件

[英]parsing CSV files backwards

我有以下格式的csv文件:

CSV FILE
"a"             , "b"     , "c" , "d"
hello, world    , 1       , 2   , 3
1,2,3,4,5,6,7   , 2       , 456 , 87
h,1231232,3     , 3       , 45  , 44

問題是第一個字段中有逗號“,”。 我無法控制文件生成,因為這是我收到它們的格式。有沒有辦法從行尾到頭開始向后讀取CSV文件?

如果我在正確的方向上被引導,我不介意寫一個小蟒蛇腳本來這樣做。

rsplit字符串方法從右邊開始而不是從左邊開始分割字符串,因此它可能正是你要查找的內容(它需要一個參數指定要分割的最大次數):

line = "hello, world    , 1       , 2   , 3"
parts = line.rsplit(",", 3)
print parts  # prints ['hello, world    ', ' 1       ', ' 2   ', ' 3']

如果要從拆分列表中的每個項目的開頭和結尾去除空白,那么您可以使用帶有列表推導的strip方法

parts = [s.strip() for s in parts]
print parts  # prints ['hello, world', '1', '2', '3']

我不完全理解你為什么要反向閱讀每一行,但你可以這樣做:

import csv
file = open("mycsvfile.csv")
reversedLines = [line[::-1] for line in file]
file.close()
reader = csv.reader(reversedLines)
for backwardRow in reader:
    lastField = backwardRow[0][::-1]
    secondField = backwardRow[1][::-1]

你總是可以用正則表達式做一些事情,比如(perl regex)

#!/usr/bin/perl

use IO::File;

if (my $file = new IO::File("test.csv"))
{
    foreach my $line (<$file>) {
    $line =~ m/^(.*),(.*?),(.*?),(.*?)$/;
    print "[$1][$2][$3][$4]\n";
    }
} else {
    print "Unable to open test.csv\n";
}

(第一個是貪婪搜索,最后3個不是) 編輯 :發布完整代碼而不僅僅是正則表達式

首先反轉字符串然后處理它。

tmp = tmp [:: - 1]

從您提供的示例中,看起來“列”是固定大小。 首先(帶逗號的那個)是16個字符長,所以為什么不嘗試逐行讀取文件,然后讀取前16個字符(作為第一列的值)的每一行,其余的相應? 在獲得每個值之后,您可以進一步解析它(修剪空格,等等......)。

那不是一個CSV文件,逗號分隔意味着那個。

你怎么能確定不是:

CSV FILE
"a"             , "b"     , "c" , "d"
hello           , world   , 1   , 2   , 3
1               , 2       , 3   , 4   , 5,6,7,2,456,87
h               , 1231232 , 3   , 3   , 45,44

如果文件與您指示的那樣,則第一個組應該用引號括起來,看起來好像字段名稱很奇怪,包含逗號的字段不是。

我不喜歡修復錯誤來源,我會推回數據生成器以提供正確的CSV,如果這是他們聲稱的那樣。

如果你總是期望相同數量的列,並且只有第一列可以包含逗號,那么只需讀取任何內容並在開頭連接多余的列。

問題是接口是模糊的,你可以試圖繞過這個,但更好的解決方案是嘗試修復接口(這通常比創建幾個補丁更難......)。

我同意啤酒先生的意見。 這是一個格式錯誤的csv文件。 您最好的選擇是找到其他分隔符或停止重載逗號或引用/轉義非字段分隔逗號

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM