如何将包含逗号和引号的Google公式添加到CSV文件中?

p5fdfcr1  于 2023-01-22  发布在  Go
关注(0)|答案(2)|浏览(128)

我尝试从Python输出一个CSV文件,并将其中一个条目设置为Google工作表公式:
下面是公式var的样子:

strLink = "https://xxxxxxx.xxxxxx.com/Interact/Pages/Content/Document.aspx?id=" + strId + "&SearchId=0&utm_source=interact&utm_medium=general_search&utm_term=*"
    strLinkCellFormula = "=HYPERLINK(\"" + strLink + "\", \"" + strTitle + "\")"

然后对于CSV的每一行,我有这样的代码:

strCSV = strCSV + strId + ", " + "\"" + strTitle + "\", " + strAuthor + ", " + strDate + ", " + strStatus + ", " + "\"" + strSection + "\", \"" +  strLinkCellFormula +"\"\n"

这并不完全有效,Google工作表的超链接公式如下:

=HYPERLINK(url, title)

而且我似乎不能让逗号转义。所以在我的工作表中,我得到了一个额外的列,其中的标题,显然公式不工作。任何帮助将不胜感激。

neskvpey

neskvpey1#

尝试使用;作为公式参数分隔符。它的工作原理应该相同。

kadbb459

kadbb4592#

与其重新发明轮子,不如使用内置的csv.writer类编写CSV行。这个类负责转义数据中的逗号和引号,因此不需要构建自己的转义逻辑。这有助于避免strLinkCellFormula = ...strCSV = strCSV + ...行中的转义混乱。
例如:

import csv

urls = ["https://google.com", "https://stackoverflow.com/", "https://www.python.org/"]

titles = ["Google", "Stack Overflow", "Python"]

with open("file.csv", "w") as fw:
    writer = csv.writer(fw)
    writer.writerow(["Company", "Website"])
    for u, t in zip(urls, titles):
        formula = f'=HYPERLINK("{u}", "Visit {t}")'
        row = [t, formula]
        writer.writerow(row)

注意,在上面的formula = ...行中,我使用f-string syntax将URL和title格式化为字符串,还使用 * 撇号 * 定义字符串,因为我知道字符串将包含引号,我不想麻烦地转义它们。
这将生成以下CSV:

Company,Website
Google,"=HYPERLINK(""https://google.com"", ""Visit Google"")"
Stack Overflow,"=HYPERLINK(""https://stackoverflow.com/"", ""Visit Stack Overflow"")"
Python,"=HYPERLINK(""https://www.python.org/"", ""Visit Python"")"

其中逗号和引号的转义已经处理好了。Excel/GSheets也可以正确读取它,因为它符合标准的CSV格式:

对于您的特定情况,您可以这样写入CSV文件:

with open(filename, "w") as wf:
    writer = csv.writer(wf)
    writer.writerow(headers) # if necessary
    for ...:
        strLink = f"https://xxxxxxx.xxxxxx.com/Interact/Pages/Content/Document.aspx?id={strID}&SearchId=0&utm_source=interact&utm_medium=general_search&utm_term=*"
        strLinkCellFormula = f'=HYPERLINK("{strLink}", "{strTitle}")'
        row = [strId, strTitle, strAuthor, strDate, strStatus, strSection, strLinkCellFormula]
        writer.writerow(row)

相关问题