Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PYTHON中的两个CSV文件中查找公共区域_Python_Csv - Fatal编程技术网

在PYTHON中的两个CSV文件中查找公共区域

在PYTHON中的两个CSV文件中查找公共区域,python,csv,Python,Csv,我有两个CSV文件,每个文件有10列,其中第一列称为“主键” 我需要使用Python来查找两个CSV文件之间的公共区域。例如,我应该能够检测到CSV1中的行27-45等于CSV2中的行125-145,以此类推 我只是比较主键(第一列)。其余数据不考虑用于比较。我需要在两个单独的CSV文件中提取这些公共区域(一个用于CSV1,一个用于CSV2) 我已经在两个“列表列表”中解析并存储了两个CSV文件的行,lstCAN\u LOG\u TABLE和lstSHADOW\u LOG\u TABLE,因此问

我有两个CSV文件,每个文件有10列,其中第一列称为“主键”

我需要使用Python来查找两个CSV文件之间的公共区域。例如,我应该能够检测到CSV1中的行27-45等于CSV2中的行125-145,以此类推

我只是比较主键(第一列)。其余数据不考虑用于比较。我需要在两个单独的CSV文件中提取这些公共区域(一个用于CSV1,一个用于CSV2)

我已经在两个“列表列表”中解析并存储了两个CSV文件的行,
lstCAN\u LOG\u TABLE
lstSHADOW\u LOG\u TABLE
,因此问题可以归结为比较这两个列表

我目前的假设是,如果有10个后续匹配(
MAX\u COMMON\u THRESHOLD
),我已经到达了一个公共区域的开头。我不能记录单行(与true相比),因为将有相等的区域(根据主键)和我需要识别的区域

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]):  #Consider for comparison only CAN IDs
            index_can_log = index                                           #Position where CAN Log is to be compared
            index_shadow_log = l_index                                      #Position from where CAN Shadow Log is to be considered
            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
                    print("No Match")
                    break
            #we might have found start of common region         
            if(bPreScreened == 1):      
                print("Start={0} End={1} can_index={2}".format(start,end,can_index))
                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:
                            dump_file.close()   
                            print("\nCommon Region in Two CSVs identifed and recorded\n")                           
                            return
dump_file.close()   
print("\nCommon Region in Two CSVs identifed and recorded\n")
CSV2:

216 0.000238225 F4  41  C0  FB  28  0   0   0   MS CAN
109 0.0002256   15  8B  31  0   8   43  58  0   HS CAN
216 0.000238025 FB  47  C6  1   28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
216 0.0002361   0F  5C  DB  14  28  0   0   0   MS CAN
216 0.000236225 16  63  E2  1B  28  0   0   0   MS CAN
109 0.0001412   16  A3  31  0   8   63  58  0   HS CAN
216 0.000234075 1C  6A  E9  22  28  0   0   0   MS CAN
40A 0.000259925 C1  1   46  54  30  44  47  36  HS CAN
4A  0.000565975 2   0   0   0   0   0   0   C0  MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
预期输出CSV1:

216 0.000238225 F4  41  C0  FB  28  0   0   0   MS CAN
109 0.0002256   15  8B  31  0   8   43  58  0   HS CAN
216 0.000238025 FB  47  C6  1   28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
216 0.0002361   0F  5C  DB  14  28  0   0   0   MS CAN
216 0.000236225 16  63  E2  1B  28  0   0   0   MS CAN
109 0.0001412   16  A3  31  0   8   63  58  0   HS CAN
216 0.000234075 1C  6A  E9  22  28  0   0   0   MS CAN
40A 0.000259925 C1  1   46  54  30  44  47  36  HS CAN
4A  0.000565975 2   0   0   0   0   0   0   C0  MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
预期输出CSV2:

216 0.000238225 F4  41  C0  FB  28  0   0   0   MS CAN
109 0.0002256   15  8B  31  0   8   43  58  0   HS CAN
216 0.000238025 FB  47  C6  1   28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
216 0.0002361   0F  5C  DB  14  28  0   0   0   MS CAN
216 0.000236225 16  63  E2  1B  28  0   0   0   MS CAN
109 0.0001412   16  A3  31  0   8   63  58  0   HS CAN
216 0.000234075 1C  6A  E9  22  28  0   0   0   MS CAN
40A 0.000259925 C1  1   46  54  30  44  47  36  HS CAN
4A  0.000565975 2   0   0   0   0   0   0   C0  MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
观察到的输出CSV1

340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
和成千上万的冗余行数据

编辑-根据建议解决(暂时更改为):

216 0.000238225 F4  41  C0  FB  28  0   0   0   MS CAN
109 0.0002256   15  8B  31  0   8   43  58  0   HS CAN
216 0.000238025 FB  47  C6  1   28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
216 0.0002361   0F  5C  DB  14  28  0   0   0   MS CAN
216 0.000236225 16  63  E2  1B  28  0   0   0   MS CAN
109 0.0001412   16  A3  31  0   8   63  58  0   HS CAN
216 0.000234075 1C  6A  E9  22  28  0   0   0   MS CAN
40A 0.000259925 C1  1   46  54  30  44  47  36  HS CAN
4A  0.000565975 2   0   0   0   0   0   0   C0  MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
340 0.000240175 0A  18  0   C2  0   0   6F  FF  MS CAN
216 0.000240225 24  70  EF  28  28  0   0   0   MS CAN
216 0.000236225 2B  77  F7  2F  28  0   0   0   MS CAN
216 0.0002278   31  7D  FD  35  28  0   0   0   MS CAN
学习:在Python中,循环索引不能在运行时更改

dump_file=open(“MATCH_PATTERN.txt”,“w+”)
打印(“可以记录的条目数={0}”。格式(len(lstCAN_LOG_TABLE)))
打印(“卷影日志的条目数={0}”。格式(len(lstSHADOW_LOG_TABLE)))
索引=0
而(索引<(输入文件\u一行\u计数-1)):
l_指数=0
而(l_索引<(输入文件\u两行\u计数-1)):
如果(lstSHADOW_LOG_TABLE[l_index][1]==lscan_LOG_TABLE[index][1]):#考虑仅比较CAN ID
index_can_log=索引#比较can日志的位置
index_shadow_log=l_index#从何处可以考虑阴影日志的位置
开始=索引\u阴影\u日志
can_index=index

如果((index\u shadow\u log+MAX\u COMMON\u THRESHOLD)
index
for
循环中的迭代器。如果您在循环中更改了它,它将在每次迭代后重新分配

比如说,当您的
for
循环中的
index=5
index+=1
执行了3次。现在
index=8
。但是在这个迭代结束后,当您的代码返回到
for
时,索引将被分配到
index x=6

请尝试以下示例:

for index in range(0,5):
    print 'iterator:', index
    index = index + 2
    print 'index:', index
输出将是:

iterator: 0
index: 2
iterator: 1
index: 3
iterator: 2
index: 4
iterator: 3
index: 5
iterator: 4
index: 6
要解决此问题,您可能需要将
for
循环更改为
while
循环

编辑: 如果我没有理解错的话,您试图在两个文件中找到“相同”列并存储它们。 如果是这种情况,实际上您的工作可以通过使用以下代码轻松完成:

import csv # import csv module to read csv files

file1 = 'csv1.csv' # input file 1
file2 = 'csv2.csv' # input file 2
outfile = 'csv3.csv' # only have one output file since two output files will be the same

read1 = csv.reader(open(file1, 'r')) # read input file 1
write = csv.writer(open(outfile, 'w')) # write to output file

# for each row in input file 1, compare it with each row in input file 2
# if they are the same, write that row into output file
for row1 in read1:
    read2 = csv.reader(open(file2, 'r'))
    for row2 in read2:
        if row1 == row2:
            write.writerow(row1)

read1.close()
write.close()

你基本上想在第一列加入你的文件?或者你只是想要这个位置?你能提供最低限度的示例输出和预期输出吗?两个CSV文件应该有一些公共区域。第一个CSV文件中的几行与第二个CSV文件中相同数量的行相匹配(当我说行相等时,我只是指主键。其余的列值可能不同)。但是,第二个CSV文件中匹配行的起始位置可能与第一个CSV文件中匹配行的起始位置不一致。上面的算法我在两个单独的CSV中转储公共行,但我得到了更多条目(第一个CSV文件有1000行,但在运行算法后,我得到了公共区域,但我得到了22000行)。对于范围内的索引(len(lstCAN_LOG_TABLE)):if((index+1)<(input_file_one_row_count-1)):index=index+1由于某种原因,索引会下降。我觉得索引应该一直上升。我不知道为什么索引会下降到某个旧值。请用输入和预期输出编辑您的问题。原始帖子已编辑。谢谢JoYSwordless。我将做出相应的更改。@AbhishekDhar您好,我不确定我是否理解您的问题n正确,但如果我没有误解,应该有一个简单的方法来解决您的问题,请参阅更新的答案。至少它适用于您的帖子中的示例输入/输出。事实上,问题稍微复杂一些。有两个CSV文件具有相同的列数和相同的列名(因此两个CSV文件具有相同的属性).CAN ID是主键(属性之一),是两个CSV文件之间唯一的公共因子。整个CSV1很可能包含在CSV2中(CSV2“x”到“y”中包含CAN ID从“x”到“y”的所有CSV1行,但具有相同CAN ID的公共行的其他属性可能不同)或者CSV1中的一部分行可能包含在CSV2(CAN ID的相同序列)中。想法是识别2个CSV文件(与CAN ID完全匹配且序列完全相同的行)之间的公共区域&因此,在两个不同的CSV文件中登录相应的行,以便识别其他属性中的差异,并生成其他统计信息(如一个特定can ID的出现次数、标准偏差、方差等)。因此,可以使用各种用例(CSV2中包含CSV1的所有行,CSV2中包含CSV1行的子集)但当我说同一行时,我的意思是相同的CAN ID&以相同的顺序(其他属性可能会有所不同)。我按照您的建议,将FOR改为WHILE,ALGO现在运行良好。非常感谢您提供的宝贵建议。