如果前一个字段为空,则用以前的数据填充 table 中的下一个字段
Populate next field in table with previous data if prior field is empty
我有一个 CSV 直接与我从 QGIS 2.8 开发的应用程序中的一系列点和线通信。但是,CSV 有点问题。提供 CSV 数据的硬件每隔几行仅提供 location 数据。也就是说,有一个属性table指定了X和Y列,其字段只在关键时刻填充。其余的是其他仍然有用的数据,但位置只是间歇性地更新。
我对我的点要素进行了结构化,以便仅使用最底部(最近)的属性行来显示一个点。当然,我需要最底部一行的位置数据,否则该点就会消失。目前我没有得到它,但偶尔会。我的 CSV -> 点代码目前看起来像这样(使用 pyshp
库):
cur_dir = os.path.dirname(os.path.realpath(__file__))
file_location = os.path.join(cur_dir, "data", "mycsv.csv")
out_file = os.path.join(cur_dir, "data", "mypoint.shp")
idd, az, y, x = [], [], [], []
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
y.append(float(row[6]))
x.append(float(row[7]))
print "appended"
w = shapefile.Writer(shapefile.POINT)
w.field('ID', 'N')
w.field('AZIMUTH', 'N', 12)
w.field('Y', 'F', 10, 8)
w.field('X', 'F', 10, 8)
for j, k in enumerate(x): #write shapefile
w.point(k, y[j])
w.record(idd[j],az[j],y[j], k )
print "recorded"
w.save(out_file)
这是 CSV 文件的一个片段。您将在右侧看到切碎的列:http://i.stack.imgur.com/ULZOS.png
我已经开始尝试在多个枚举器下方的不同位置添加 if x > 0:
条件,以便在读取数据之前可能停止数字化,但我每次都收到错误 min() arg is an empty sequence
。我什至不确定这是开始的正确位置,因为它可能只会将属性彼此打乱。我真的只需要某种 "if X or Y field is null, populate field with prior field's data" 脚本。
我正在使用 Python 2.7 和 PyQt4,从 QGIS 2.8 API 开发出来,运行 在 Ubuntu 14.04,
您可以缓存 X 和 Y 数据点的最后一个有效值,我假设它们在行 [6] 和行 [7] 中
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
lastX = 0.
lastY = 0.
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
try:
y.append(float(row[6]))
lastY = float(row[6]))
except (TypeError, ValueError) as e:
if len(y) > 0:
y.append(lastY)
try:
x.append(float(row[7]))
lastX = float(row[7]))
except (TypeError, ValueError) as e:
if len(x) > 0:
x.append(lastX)
print "appended"
我假设缺失的 CSV 值是空字符串或 None。当转换为 float() 时,这两个值都会引发异常。如果值为 0,则要求原始开发人员将值设为空,因为 0 可能是真实坐标而不是缺失坐标。
如果 X 和 Y 总是同时通过(如果你有一个,你总是有另一个)那么你可以使用一个 try/except 块来处理所有情况。
我有一个 CSV 直接与我从 QGIS 2.8 开发的应用程序中的一系列点和线通信。但是,CSV 有点问题。提供 CSV 数据的硬件每隔几行仅提供 location 数据。也就是说,有一个属性table指定了X和Y列,其字段只在关键时刻填充。其余的是其他仍然有用的数据,但位置只是间歇性地更新。
我对我的点要素进行了结构化,以便仅使用最底部(最近)的属性行来显示一个点。当然,我需要最底部一行的位置数据,否则该点就会消失。目前我没有得到它,但偶尔会。我的 CSV -> 点代码目前看起来像这样(使用 pyshp
库):
cur_dir = os.path.dirname(os.path.realpath(__file__))
file_location = os.path.join(cur_dir, "data", "mycsv.csv")
out_file = os.path.join(cur_dir, "data", "mypoint.shp")
idd, az, y, x = [], [], [], []
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
y.append(float(row[6]))
x.append(float(row[7]))
print "appended"
w = shapefile.Writer(shapefile.POINT)
w.field('ID', 'N')
w.field('AZIMUTH', 'N', 12)
w.field('Y', 'F', 10, 8)
w.field('X', 'F', 10, 8)
for j, k in enumerate(x): #write shapefile
w.point(k, y[j])
w.record(idd[j],az[j],y[j], k )
print "recorded"
w.save(out_file)
这是 CSV 文件的一个片段。您将在右侧看到切碎的列:http://i.stack.imgur.com/ULZOS.png
我已经开始尝试在多个枚举器下方的不同位置添加 if x > 0:
条件,以便在读取数据之前可能停止数字化,但我每次都收到错误 min() arg is an empty sequence
。我什至不确定这是开始的正确位置,因为它可能只会将属性彼此打乱。我真的只需要某种 "if X or Y field is null, populate field with prior field's data" 脚本。
我正在使用 Python 2.7 和 PyQt4,从 QGIS 2.8 API 开发出来,运行 在 Ubuntu 14.04,
您可以缓存 X 和 Y 数据点的最后一个有效值,我假设它们在行 [6] 和行 [7] 中
with open(file_location, 'rb') as csvfile:
r = list(csv.reader(csvfile, delimiter=','))
reader = r[len(r) - 1:] #read only top row
lastX = 0.
lastY = 0.
for i, row in reversed(list(enumerate(reader))): #reverse table
idd.append(str(row[0]))
az.append(float(row[2]))
try:
y.append(float(row[6]))
lastY = float(row[6]))
except (TypeError, ValueError) as e:
if len(y) > 0:
y.append(lastY)
try:
x.append(float(row[7]))
lastX = float(row[7]))
except (TypeError, ValueError) as e:
if len(x) > 0:
x.append(lastX)
print "appended"
我假设缺失的 CSV 值是空字符串或 None。当转换为 float() 时,这两个值都会引发异常。如果值为 0,则要求原始开发人员将值设为空,因为 0 可能是真实坐标而不是缺失坐标。
如果 X 和 Y 总是同时通过(如果你有一个,你总是有另一个)那么你可以使用一个 try/except 块来处理所有情况。