Только получение данных столбца из API Qualtrics - PullRequest
0 голосов
/ 11 октября 2019

Я использовал API-интерфейс для опроса, где я только что использовал их пример кода из документации https://api.qualtrics.com/docs/getting-survey-responses-via-the-new-export-apis

Код работает просто отлично:

import requests
import zipfile
import json
import io, os
import sys
import re
import logging

logging.basicConfig(level=logging.DEBUG, filename='application.log',
                    format='%(asctime)s.%(msecs)03d %(levelname)s %(module)s - %(funcName)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S')


"""
Function to export survey from the qualtricks api.

"""


def exportSurvey(apiToken, surveyId, dataCenter, fileFormat):
    surveyId = surveyId
    fileFormat = fileFormat
    dataCenter = dataCenter
    # Setting static parameters
    requestCheckProgress = 0.0
    progressStatus = "inProgress"
    baseUrl = "https://{0}.qualtrics.com/API/v3/surveys/{1}/export-responses/".format(dataCenter, surveyId)
    headers = {
        "content-type": "application/json",
        "x-api-token": apiToken,
    }

    # Step 1: Creating Data Export
    downloadRequestUrl = baseUrl
    downloadRequestPayload = '{"format":"' + fileFormat + '"}'
    downloadRequestResponse = requests.request("POST", downloadRequestUrl, data=downloadRequestPayload, headers=headers)
    progressId = downloadRequestResponse.json()["result"]["progressId"]
    print(downloadRequestResponse.text)

    # Step 2: Checking on Data Export Progress and waiting until export is ready
    while progressStatus != "complete" and progressStatus != "failed":
        print("progressStatus=", progressStatus)
        requestCheckUrl = baseUrl + progressId
        requestCheckResponse = requests.request("GET", requestCheckUrl, headers=headers)
        requestCheckProgress = requestCheckResponse.json()["result"]["percentComplete"]
        print("Download is " + str(requestCheckProgress) + " complete")
        progressStatus = requestCheckResponse.json()["result"]["status"]

    # step 2.1: Check for error
    if progressStatus is "failed":
        logging.error("Could not export file")
        raise Exception("export failed")

    fileId = requestCheckResponse.json()["result"]["fileId"]

    # Step 3: Downloading file
    requestDownloadUrl = baseUrl + fileId + '/file'
    requestDownload = requests.request("GET", requestDownloadUrl, headers=headers, stream=True)

    # Step 4: Unzipping the file
    zipfile.ZipFile(io.BytesIO(requestDownload.content)).extractall("Files")
    print('Complete')
    logging.info("Successfully downloaded file")


def main(apiToken, surveyId, dataCenter, fileFormat):


    if fileFormat not in ["csv", "tsv", "spss"]:
        logging.error("File format was given in wrong format")
        print('fileFormat must be either csv, tsv, or spss')
        sys.exit(2)

    r = re.compile('^SV_.*')
    m = r.match(surveyId)
    if not m:
        logging.error("Survey id did not match the right format")
        print("survey Id must match ^SV_.*")
        sys.exit(2)

    exportSurvey(apiToken, surveyId, dataCenter, fileFormat)


if __name__ == "__main__":
    apiToken = 'XXX  # hardcoded apiToken
    cyber_survey_19 = {
    "data_center": 'XX',
    "survey_id":  'XXX',  # hard coded survey id for the fist dyber survey.
    "file_format": 'csv'
    }
    cyber_survey_17 = {
        "data_center": 'XXX',
        "survey_id": 'XXX',  # hard coded survey id for the fist dyber survey.
        "file_format": 'csv'
    }
    main(apiToken, surveyId=cyber_survey_17['survey_id'], dataCenter=cyber_survey_17['data_center'], fileFormat=cyber_survey_17['file_format'])

проблемав том, что опрос выходит в таком формате.

StartDate,EndDate,Status,IPAddress,Progress,Duration (in seconds),Finished,RecordedDate,ResponseId,RecipientLastName,RecipientFirstName,RecipientEmail,ExternalReference,LocationLatitude,LocationLongitude,DistributionChannel,UserLanguage,Q1,Q1_17_TEXT,Q2,Q2_13_TEXT,Q4,Q5_1,Q5_2,Q6,Q7,Q8,Q9,Q10_1,Q10_2,Q11_1,Q11_2,Q12_1_1,Q12_1_2,Q12_2_1,Q12_2_2,Q12_3_1,Q12_3_2,Q12_4_1,Q12_4_2,Q12_5_1,Q12_5_2,Q12_6_1,Q12_6_2,Q12_7_1,Q12_7_2,Q12_8_1,Q12_8_2,Q12_9_1,Q12_9_2,Q12_10_1,Q12_10_2,Q12_11_1,Q12_11_2,Q12_12_1,Q12_12_2,Q29,Q16,Q14_1,Q14_2,Q14_3,Q14_4,Q14_5,Q14_6,Q14_7,Q14_8,Q14_9,Q14_10,Q14_11,Q14_12,Q14_13,Q14_14,Q14_15,Q14_14_TEXT,Q15_1,Q15_2,Q15_3,Q15_4,Q15_5,Q15_6,Q15_7,Q15_8,Q15_9,Q15_10,Q15_9_TEXT,Q17,Q18_1,Q18_2,Q18_3,Q18_4,Q18_5,Q18_6,Q18_7,Q18_8,Q18_9,Q18_10,Q18_11,Q18_12,Q18_13,Q18_14,Q18_13_TEXT,Q19,Q20,Q20_4_TEXT,Q21_1,Q21_2,Q22,Q24_1,Q24_2,Q24_3,Q24_4,Q25_1,Q25_2,Q26,Q27,Q28,Q29,Q30_1,Q30_2,Q30_3,Q30_4,Partner,Country,Source,Q14_14_TEXT - Sentiment,Q14_14_TEXT - Sentiment Score,Q14_14_TEXT - Sentiment Polarity,Q14_14_TEXT - Topics
Start Date,End Date,Response Type,IP Address,Progress,Duration (in seconds),Finished,Recorded Date,Response ID,Recipient Last Name,Recipient First Name,Recipient Email,External Data Reference,Location Latitude,Location Longitude,Distribution Channel,User Language,Hvad er din primære funktion/titel? - Selected Choice,Hvad er din primære funktion/titel? - Anden funktion: - Text,Hvem i ledelsen er ansvarlig for informations- /cybersikkerheden - Selected Choice,Hvem i ledelsen er ansvarlig for informations- /cybersikkerheden - Andet - Text,Har I i  din virksomhed et dedikeret budget for informations-/cybersikkerhed?,"Hvor stort er budgettet?



Nedenstående skal vurderes i forhold til den aktuelle situation og 18 måneder frem - I dag?","Hvor stort er budgettet?



Nedenstående skal vurderes i forhold til den aktuelle situation og 18 måneder frem - 18 måneder frem?","I hvilken grad har  direktionen/ledelsen, efter din opfattelse, fokus på at opnå den rette balance mellem de cybertrusler, din virksomhed står overfor, og jeres investeringer i cybersikkerhed?",Hvor ofte briefer virksomhedens sikkerhedsansvarlige virksomhedens direktion om risikoen ved cybertrusler?,"I hvilken grad vurderer du, at din virksomheds bestyrelse bruger tid på at drøfte spørgsmål om cyber- og/eller informationssikkerhed på bestyrelsesmøderne?","Bekymrer du dig mere eller mindre om de cybertrusler, I i din virksomhed oplever i dag, end du gjorde for 12 måneder siden?","Hvor mange gange har I i din virksomhed været udsat for en sikkerhedshændelse, som havde en negativ påvirkning på forretningen?



En sikkerhedshændelse defineres i det følgende som: 



En hændelse, der negativt påvirker eller vurderes at ville kunne påvirke forretningens data-tilgængelighed, -integritet eller -fortrolighed, informationssystemer, digitale netværk eller digitale tjenester. - Seneste regnskabsår","Hvor mange gange har I i din virksomhed været udsat for en sikkerhedshændelse, som havde en negativ påvirkning på forretningen?



En sikkerhedshændelse defineres i det følgende som: 

, где вопросы включены в файл CSV, я обнаружил, что я из пользовательского интерфейса, можно добавить эту опцию, чтобы получить данные только из столбцов.

image

Как я могу добавить эту опцию к вызову API или есть другой способ сделать это?

...