Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.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 在将文件导入SQL Server 2008之前,解析包含随机改变顺序的列的文件的最佳方法是什么?_Python_Perl_Sql Server 2008_Parsing - Fatal编程技术网

Python 在将文件导入SQL Server 2008之前,解析包含随机改变顺序的列的文件的最佳方法是什么?

Python 在将文件导入SQL Server 2008之前,解析包含随机改变顺序的列的文件的最佳方法是什么?,python,perl,sql-server-2008,parsing,Python,Perl,Sql Server 2008,Parsing,我有一个文件,其中的列如下所示: Column1,Column2,Column3,Column4,Column5,Column6 1,2,3,4,5,6 1,2,3,4,5,6 1,2,3,4,5,6 1,2,3,4,5,6 1,2,3,4,5,6 1,2,3,4,5,6 Column1,Column3,Column2,Column6,Column5,Column4 1,3,2,6,5,4 1,3,2,6,5,4 1,3,2,6,5,4 Column2,Column3,Column4,Colum

我有一个文件,其中的列如下所示:

Column1,Column2,Column3,Column4,Column5,Column6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
1,2,3,4,5,6
Column1,Column3,Column2,Column6,Column5,Column4
1,3,2,6,5,4
1,3,2,6,5,4
1,3,2,6,5,4
Column2,Column3,Column4,Column5,Column6,Column1
2,3,4,5,6,1
2,3,4,5,6,1
2,3,4,5,6,1

列在文件中间随机重新排序,知道顺序的唯一方法是查看数据前的最后一组标题(CulnN1,Culn2,等等)。(我还简化了数据,以便更容易描述。在现实生活中,没有办法区分数据,因为它们都是大的整数值,可以进入任何列)


显然,在使用大容量插入时,这对SQL Server不太友好,因此我需要找到一种方法,以与SQL数据库中表的列顺序相匹配的一致顺序排列所有列。最好的方法是什么?我听说Python是要使用的语言,但我从未使用过它。有什么建议/示例吗欢迎使用任何语言编写脚本。

这可以通过两个步骤轻松解决:

  • 新头文件启动时将文件拆分为多个文件
  • 使用csv dict读取器读取每个文件,对键进行排序,并按正确顺序重新输出行
下面是一个例子,你可以如何看待它

def is_header(line):
    return line.find('Column') >= 0

def process(lines):  
    headers = None
    for line in lines:
        line = line.strip()
        if is_header(line):
            headers = list(enumerate(line.split(",")))
            headers_map = dict(headers)
            headers.sort(key=lambda (i,v):headers_map[i])
            print ",".join([h for i,h in headers])
            continue

        values = list(enumerate(line.split(",")))
        values.sort(key=lambda (i,v):headers_map[i])
        print ",".join([v for i,v in values])

if __name__ == "__main__":
    import sys
    process(open(sys.argv[1]))

您还可以更改函数
is_header
,以便在实际情况下正确识别header

这可以通过两个步骤轻松解决:

  • 新头文件启动时将文件拆分为多个文件
  • 使用csv dict读取器读取每个文件,对键进行排序,并按正确顺序重新输出行
下面是一个例子,你可以如何看待它

def is_header(line):
    return line.find('Column') >= 0

def process(lines):  
    headers = None
    for line in lines:
        line = line.strip()
        if is_header(line):
            headers = list(enumerate(line.split(",")))
            headers_map = dict(headers)
            headers.sort(key=lambda (i,v):headers_map[i])
            print ",".join([h for i,h in headers])
            continue

        values = list(enumerate(line.split(",")))
        values.sort(key=lambda (i,v):headers_map[i])
        print ",".join([v for i,v in values])

if __name__ == "__main__":
    import sys
    process(open(sys.argv[1]))
您还可以更改函数
is_header
,以便在实际情况下正确识别header

python中的解决方案:

我会逐行阅读并查找标题。当我找到标题时,我会用它来计算顺序(不知何故)。然后我将该顺序传递给
itemgetter
,这将实现对元素重新排序的魔力:

from operator import itemgetter
def header_parse(line,order_dict):
    header_info = line.split(',')
    indices = [None] * len(header_info)
    for i,col_name in enumerate(header_info):
        indices[order_dict[col_name]] = i
    return indices

def fix(fname,foutname):
    with open(fname) as f,open(foutname,'w') as fout:
        #Assume first line is a "header" and gives the order to use for the
        #rest of the file
        line = f.readline()
        order_dict = dict((name,i) for i,name in enumerate(line.strip().split(',')))
        reorder_magic = itemgetter(*header_parse(line.strip(),order_dict))
        for line in f:
            if line.startswith('Column'):  #somehow determine if this is a "header"
                reorder_magic = itemgetter(*header_parse(line.strip(),order_dict))
            else:
                fout.write(','.join(reorder_magic(line.strip().split(','))) + '\n')

if __name__ == '__main__':
    import sys
    fix(sys.argv[1],sys.argv[2])
现在您可以将其称为:

python fixscript.py badfile goodfile
python中的解决方案:

我会逐行阅读并查找标题。当我找到标题时,我会用它来计算顺序(不知何故)。然后我将该顺序传递给
itemgetter
,这将实现对元素重新排序的魔力:

from operator import itemgetter
def header_parse(line,order_dict):
    header_info = line.split(',')
    indices = [None] * len(header_info)
    for i,col_name in enumerate(header_info):
        indices[order_dict[col_name]] = i
    return indices

def fix(fname,foutname):
    with open(fname) as f,open(foutname,'w') as fout:
        #Assume first line is a "header" and gives the order to use for the
        #rest of the file
        line = f.readline()
        order_dict = dict((name,i) for i,name in enumerate(line.strip().split(',')))
        reorder_magic = itemgetter(*header_parse(line.strip(),order_dict))
        for line in f:
            if line.startswith('Column'):  #somehow determine if this is a "header"
                reorder_magic = itemgetter(*header_parse(line.strip(),order_dict))
            else:
                fout.write(','.join(reorder_magic(line.strip().split(','))) + '\n')

if __name__ == '__main__':
    import sys
    fix(sys.argv[1],sys.argv[2])
现在您可以将其称为:

python fixscript.py badfile goodfile

因为你没有提到一个具体的问题,我假设你在提出算法时遇到了问题

  • 每行

  • 将行解析为字段
  • 如果是第一个标题行

  • 输出标题
  • 创建要定位的字段名映射

    %map = map { $fields[$_] => $_ } 0..$#fields;
    
  • 创建原始位置到新位置的地图

    @map = @map{ @fields };
    
    @map = @map{ @fields };
    
  • 如果不是第一行,而是标题行

  • 将原始位置的地图更新为新位置

    @map = @map{ @fields };
    
    @map = @map{ @fields };
    
  • 如果不是标题行

  • 对字段重新排序

    @fields[ @map ] = @fields;
    
  • 输出该行


  • (代码片段是用Perl编写的。)

    因为您没有提到具体的问题,所以我假设您在提出算法时遇到了问题

  • 每行

  • 将行解析为字段
  • 如果是第一个标题行

  • 输出标题
  • 创建要定位的字段名映射

    %map = map { $fields[$_] => $_ } 0..$#fields;
    
  • 创建原始位置到新位置的地图

    @map = @map{ @fields };
    
    @map = @map{ @fields };
    
  • 如果不是第一行,而是标题行

  • 将原始位置的地图更新为新位置

    @map = @map{ @fields };
    
    @map = @map{ @fields };
    
  • 如果不是标题行

  • 对字段重新排序

    @fields[ @map ] = @fields;
    
  • 输出该行



  • (代码段是用Perl编写的。)

    您遇到了什么问题?(aka:所以不是代码编写服务)两个问题:1.这是一个在SQL上运行的完全自主的批处理作业,还是只执行一次?2.文件中大约有多少更改?ikegami:我现在无法将此文件导入SQL server,因为数据进入了这样的错误列。您不能通过编程大容量插入来重新排列cOLMUN在运行它的中间。我计划每天导入这个数据,但是我不需要在SQL中做这一切。我可以用其他脚本/程序来修复格式化/排列,然后我就可以用SQL作业导入最终文件。文件大约有10000行。列之间的开关数。可以是完全随机的。可以是绝对零,也可以是高达20列标题的重新排序。您遇到了什么问题?(aka:所以不是代码编写服务)两个问题:1.这是一个在SQL上运行的完全自主的批处理作业,还是只执行一次?2.文件中大约有多少更改?ikegami:我现在无法将此文件导入SQL server,因为数据进入了这样的错误列。您不能通过编程大容量插入来重新排列cOLMUN在运行它的中间。我计划每天导入这个数据,但是我不需要在SQL中做这一切。我可以用其他脚本/程序来修复格式化/排列,然后我就可以用SQL作业导入最终文件。文件大约有10000行。列之间的开关数。可以是完全随机的。可以是绝对零,也可以是高达20列标题的重新排序。是否有我可以用来分割文件的程序?@eek142您可以试试这个脚本,它应该可以按原样工作,而且它不依赖具有任何特定整数或结构的列。是否有我可以用来分割文件的程序?@eek142 y你可以试试这个脚本,它应该可以正常工作,而且它不依赖于包含任何特定整数或结构的列。我可以问一下这是用什么语言编写的吗?@eek142--python。如果你想让它成为命令行脚本,我们可以这样做……1分钟……我想你是对的,必须逐行检查。我可以使用CPU资源为了做到这一点,我计划在一夜之间运行它。令人惊讶的是人们是如何成为明星的