给定两个 CSV 文件,每个文件有 10 列,其中第一列是主键。需要使用 Python 在两个 CSV 文件中找到公共区域。比较时只考虑第一列(主键),其他数据不考虑。
- 解决方案:
首先,需要解析和存储两个 CSV 文件的行,并将其存储在两个列表中。假设这两个列表分别是 lstCAN_LOG_TABLE
和 lstSHADOW_LOG_TABLE
。
接下来,需要比较这两个列表。使用 nested loops 来遍历两个列表,并比较每一行的第一列。如果两个第一列相等,则可能是公共区域的开始。
为了确定是否是公共区域的开始,需要检查接下来的 MAX_COMMON_THRESHOLD
行是否也相同。如果相同,则可以认为找到了一个公共区域的开始。
然后,需要将这个公共区域的行写入到两个新的 CSV 文件中,一个文件对应一个 CSV 文件的公共区域。
以下是详细的 Python 代码:
import csv
# 解析和存储两个 CSV 文件的行
with open('input_file_one.csv', 'r') as file1:
reader = csv.reader(file1)
lstCAN_LOG_TABLE = list(reader)
with open('input_file_two.csv', 'r') as file2:
reader = csv.reader(file2)
lstSHADOW_LOG_TABLE = list(reader)
# 设置一些变量
input_file_one_row_count = len(lstCAN_LOG_TABLE)
input_file_two_row_count = len(lstSHADOW_LOG_TABLE)
MAX_COMMON_THRESHOLD = 10 # 连续匹配的行数阈值
# 打开输出文件
with open('output_file_one.csv', 'w', newline='') as file1:
writer_one = csv.writer(file1)
with open('output_file_two.csv', 'w', newline='') as file2:
writer_two = csv.writer(file2)
# 遍历两个列表
for index in range(len(lstCAN_LOG_TABLE)):
for l_index in range(len(lstSHADOW_LOG_TABLE)):
# 比较第一列
if lstSHADOW_LOG_TABLE[l_index][1] == lstCAN_LOG_TABLE[index][1]:
# 可能找到公共区域的开始
index_can_log = index
index_shadow_log = l_index
start = index_shadow_log
if (index_shadow_log + MAX_COMMON_THRESHOLD) <= (input_file_two_row_count - 1):
end = index_shadow_log + MAX_COMMON_THRESHOLD
else:
end = (index_shadow_log) + ((input_file_two_row_count - 1) - (index_shadow_log))
can_index = index
bPreScreened = 1
# 检查接下来的行是否也相同
for num in range(start, end):
if lstSHADOW_LOG_TABLE[num][1] == lstCAN_LOG_TABLE[can_index][1]:
if (can_index + 1) < (input_file_one_row_count - 1):
can_index = can_index + 1
else:
break
else:
bPreScreened = 0
break
# 如果是公共区域的开始,则将这些行写入输出文件
if bPreScreened == 1:
for number in range(start, end):
if lstSHADOW_LOG_TABLE[number][1] == lstCAN_LOG_TABLE[index][1]:
writer_two.writerow(lstSHADOW_LOG_TABLE[number][0])
writer_one.writerow(lstCAN_LOG_TABLE[index][0])
if (index + 1) < (input_file_one_row_count - 1):
index = index + 1
else:
file1.close()
file2.close()
print("Common Region in Two CSVs identifed and recorded")
return
# 关闭输出文件
file1.close()
file2.close()
print("Common Region in Two CSVs identifed and recorded")