کتابخانه‌ی استاندارد · کدگذاری و داده

سی اس وی encoding/csv

خواندن و نوشتن پرونده‌های CSV، با نقل‌قول درست و تبدیل به مقدار پویا.

واردسازی کدگذاری.سی اس وی

CSV ساده‌ترین قالب جدول است: هر خط یک ردیف و خانه‌ها با ویرگول لاتین از هم جدا. خانه‌ای که ویرگول، نقل‌قول یا شکستن خط دارد داخل نقل‌قول می‌آید و نقل‌قول درونش دوتایی می‌شود. این بسته همین قالب را می‌خواند و می‌نویسد، خط به خط با خواندن خط و نوشتن خط یا کل متن با خواندن همه و نوشتن همه، و آن را به یک مقدار برای جیسون و برعکس تبدیل می‌کند.

همه‌ی خانه‌ها رشته‌اند؛ CSV عدد و مقدار منطقی ندارد. برای صفحه‌گسترده‌هایی با چند برگه، فرمول یا گونه، اکسل را ببینید؛ و برای CSVای که به یک مدل یادگیری ماشین داده می‌شود، داده را.

اشتباه‌های رایج:

  • جداکننده همیشه ویرگول است. پرونده‌ای از اکسل اروپایی با ; میان خانه‌ها، یا پرونده‌ای که با tab جدا شده، در هر خط یک خانه خوانده می‌شود؛ جداکننده را جایگزین کنید یا آن خط‌ها را خودتان تفکیک کنید.
  • پس از خانه‌ی داخل نقل‌قول باید بی‌فاصله ویرگول یا پایان خط بیاید. در "Pen" ,blue فاصله‌ی پس از نقل‌قول ردیف را تمام می‌کند و بقیه‌ی خط بی‌هیچ خطایی کنار می‌رود.
  • شکستن خط درون خانه‌ی نقل‌قول‌دار دوباره خوانده نمی‌شود: خواندن همه اول متن را به خط‌ها می‌شکند. نوشتن خط چنین خانه‌ای را برای ابزارهای دیگر درست در نقل‌قول می‌گذارد، ولی این خواننده آن را دو تکه می‌کند.
  • از مقدار ستون‌ها را از کلیدهای نخستین شیء و به ترتیب افزوده‌شدنشان برمی‌دارد، پس جدولی که با به مقدار خوانده شده با همان ترتیب ستون‌ها نوشته می‌شود.

راهنما: جمع‌زدن ستون‌های یک خروجی CSV

کار معمول، خروجی یک صفحه‌گسترده است: همه‌ی ردیف‌ها را بخوانید، از سرستون بگذرید، ستون‌های عددی را تبدیل کنید و جمع بزنید. خواندن همه یک جدول سی اس وی می‌دهد که هر عضو rows آن یک وکتور fields دارد، یک رشته برای هر ستون. یک نگاشت جمع‌ها را نگه می‌دارد و یک وکتور شهرها را به ترتیب نخستین دیده شدن.

encoding-csv-guide-report.salam
واردسازی کدگذاری.سی اس وی

تابع ریشه:
    متن := `date,city,product,amount
2026-10-01,Tehran,tea,120
2026-10-01,Shiraz,coffee,90
2026-10-02,Tehran,coffee,75
2026-10-02,Tabriz,tea,40
2026-10-03,Shiraz,tea,60
`
    ناپایا جدول := سی اس وی.خواندن همه(متن)
    ناپایا شهرها := وکتور {} برگردان وکتور<رشته>
    ناپایا جمع‌ها := نگاشت {} برگردان نگاشت<رشته، صحیح>
    ناپایا کل := ۰
    هر ای، ردیف در جدول.ردیف‌ها:
        اگر ای == ۰ یا ردیف.خانه‌ها.طول() < ۴:
            گذر
        پایان
        شهر := ردیف.خانه‌ها.بگیر(۱)
        مبلغ := ردیف.خانه‌ها.بگیر(۳).به صحیح()
        اگر وارونه جمع‌ها.دارد(شهر):
            شهرها.بیفزا(شهر)
        پایان
        جمع‌ها.درج(شهر، جمع‌ها.دریافت با پیش فرض(شهر، ۰) + مبلغ)
        کل += مبلغ
    پایان
    هر ش در شهرها:
        سرچاپ ش، جمع‌ها.بگیر(ش)
    پایان
    سرچاپ "جمع کل"، کل
    سی اس وی.آزادسازی جدول(جدول)
پایان
خروجیTehran 195 Shiraz 150 Tabriz 40 جمع کل 385

جلوی ردیف‌های کوتاه را بگیرید، مثل بررسی ردیف.fields.طول() < ۴: یک خط خالی یا پرونده‌ای که با دست ویرایش شده ممکن است ستون‌هایش از سرستون کمتر باشد. پس از کار، جدول را با آزادسازی جدول آزاد کنید.

راهنما: نوشتن پرونده‌ی CSV

نوشتن خط یک ردیف را به هم می‌چسباند و نقل‌قول را فقط جایی می‌گذارد که لازم است: دور خانه‌ای که ویرگول، نقل‌قول یا شکستن خط دارد، با دوتایی کردن نقل‌قول‌های درونی. این همان چیزی است که اکسل، لیبره‌آفیس و بیشتر ابزارهای ورود داده انتظار دارند، و نوشتن ردیف‌ها به دست خودتان ستون‌ها را به ترتیبی که می‌خواهید نگه می‌دارد.

encoding-csv-guide-export.salam
واردسازی کدگذاری.سی اس وی

ساختار مخاطب:
    همگانی نام: رشته = ""
    همگانی شرکت: رشته = ""
    همگانی یادداشت: رشته = ""
پایان

تابع ریشه:
    ناپایا افراد := وکتور {} برگردان وکتور<مخاطب>
    افراد.بیفزا(مخاطب { نام = "Sara Ahmadi"، شرکت = "Nik, Ltd."، یادداشت = "prefers email" })
    افراد.بیفزا(مخاطب { نام = "Reza"، شرکت = "Pars"، یادداشت = `said "call me Monday"` })

    ناپایا خروجی := ""
    ناپایا سرستون := وکتور {} برگردان وکتور<رشته>
    سرستون.بیفزا("name")
    سرستون.بیفزا("company")
    سرستون.بیفزا("note")
    خروجی = خروجی + سی اس وی.نوشتن خط(سرستون) + "\n"
    هر ف در افراد:
        ناپایا خانه‌ها := وکتور {} برگردان وکتور<رشته>
        خانه‌ها.بیفزا(ف.نام)
        خانه‌ها.بیفزا(ف.شرکت)
        خانه‌ها.بیفزا(ف.یادداشت)
        خروجی = خروجی + سی اس وی.نوشتن خط(خانه‌ها) + "\n"
    پایان
    چاپ خروجی

    ردیف := سی اس وی.خواندن خط(`Reza,Pars,"said ""call me Monday"""`)
    سرچاپ "دوباره خوانده شد:"، ردیف.بگیر(۲)
پایان
خروجیname,company,note Sara Ahmadi,"Nik, Ltd.",prefers email Reza,Pars,"said ""call me Monday""" دوباره خوانده شد: said "call me Monday"

سرستون را هم مثل ردیف‌های داده بنویسید. نوشتن خط شکستن خط را نمی‌افزاید، پس "\n" را خودتان بگذارید، یا "\r\n" برای ابزارهایی که آن را می‌خواهند. برای ذخیره‌ی نتیجه، خروجی را با بسته‌ی پرونده بنویسید.

راهنما: از CSV به جیسون

به مقدار ردیف سرستون را کلید می‌گیرد و هر ردیف دیگر را به یک شیء تبدیل می‌کند که بسته‌ی جیسون می‌تواند چاپش کند. این یعنی یک مبدل کوچک CSV به جیسون در چند خط. از مقدار از آرایه‌ای از شیء‌ها به متن CSV برمی‌گردد.

encoding-csv-guide-json.salam
واردسازی کدگذاری.سی اس وی
واردسازی کدگذاری.جیسون
واردسازی کدگذاری.مقدار

تابع ریشه:
    متن := "sku,title,stock\nBK-01,Notebook,12\nPN-07,\"Pen, blue\",0\n"
    ردیف‌ها := سی اس وی.به مقدار(متن)
    سرچاپ مقدار.طول آرایه(ردیف‌ها)، "ردیف"
    گزینه‌ها := جیسون.گزینه‌های جیسون { تورفتگی = "  "، چیدن کلیدها = درست }
    سرچاپ جیسون.کدگذاری(ردیف‌ها، گزینه‌ها)

    نخست := مقدار.عضو آرایه(ردیف‌ها، ۰)
    سرچاپ "stock یک رشته است:"، مقدار.رشته است(مقدار.مقدار کلید(نخست، "stock"))
پایان
خروجی2 ردیف [ { "sku": "BK-01", "stock": "12", "title": "Notebook" }, { "sku": "PN-07", "stock": "0", "title": "Pen, blue" } ] stock یک رشته است: true

همه‌ی خانه‌ها رشته می‌مانند، حتی 12، چون CSV گونه ندارد. ستون‌هایی را که می‌دانید عددی‌اند با به صحیح() یا به اعشار() تبدیل کنید. با گزینه‌های سی اس وی { header = نادرست }، تابع به مقدار سفارشی پرونده‌ی بی‌سرستون را می‌خواند: هر ردیف، از جمله ردیف اول، شیئی با کلیدهای col0، col1 و همین‌طور تا آخر می‌شود.

راهنما: حالت‌های مرزی

خواننده خانه‌ها را دقیقاً همان‌طور که نوشته شده‌اند نگه می‌دارد. این در چند جا مهم است:

encoding-csv-guide-pitfalls.salam
واردسازی کدگذاری.سی اس وی

تابع نمایش(سطر: رشته):
    خانه‌ها := سی اس وی.خواندن خط(سطر)
    ناپایا م := ""
    هر خ در خانه‌ها:
        م = م + "[" + خ + "]"
    پایان
    سرچاپ خانه‌ها.طول()، "خانه:"، م
پایان

تابع ریشه:
    نمایش("a,b,c")
    نمایش("a,,c")
    نمایش(" a , b ")
    نمایش(`"x,y",z`)
    نمایش(`"she said ""hi""",ok`)
    نمایش("trailing,")
    نمایش(`"Pen" ,blue,3`)
    نمایش("sku;title;stock")

    ناپایا ج := سی اس وی.خواندن همه("id,name\r\n1,Ali\r\n2,Sara\r\n")
    سرچاپ "ردیف‌ها با CRLF:"، ج.ردیف‌ها.طول()، ج.ردیف‌ها.بگیر(۲).خانه‌ها.بگیر(۱)
    سی اس وی.آزادسازی جدول(ج)
پایان
خروجی3 خانه: [a][b][c] 3 خانه: [a][][c] 2 خانه: [ a ][ b ] 2 خانه: [x,y][z] 2 خانه: [she said "hi"][ok] 2 خانه: [trailing][] 1 خانه: [Pen] 1 خانه: [sku;title;stock] ردیف‌ها با CRLF: 3 Sara
  • خانه‌ی خالی، از جمله خانه‌ی پس از ویرگول پایانی، یک رشته‌ی خالی است، نه ستونی که نباشد.
  • فاصله‌های دور خانه نگه داشته می‌شوند؛ اگر منبع شما ستون‌ها را با فاصله پر می‌کند، آن‌ها را با رشته.پیرایش بپیرایید.
  • پایان خط ویندوزی (\r\n) را خواندن همه درست می‌خواند.
  • خواندن همه خط‌های خالی را رد می‌کند، پس جدول هیچ‌وقت ردیف خالی ندارد.
  • فاصله میان نقل‌قول پایانی و ویرگول ردیف را تمام می‌کند: "Pen" ,blue,3 یک خانه می‌دهد.
  • خطی با نقطه‌ویرگول یک خانه است، چون فقط ویرگول خانه‌ها را جدا می‌کند.
  • خواندن همه پیش از خواندن خانه‌ها متن را به خط‌ها می‌شکند، پس خانه‌ای در نقل‌قول که شکستن خط دارد دو تکه برمی‌گردد. اگر داده‌ی شما ممکن است شکستن خط داشته باشد، پیش از نوشتن پرونده آن را جایگزین کنید.

گونه‌ها

ردیف سی اس وی CSVRow

ساختار ردیف سی اس وی
یک ردیف.
نامانگلیسیگونهتوضیح
خانه‌هاfieldsوکتور<رشته>خانه‌های ردیف.
encoding-csv-Table.salam
واردسازی کدگذاری.سی اس وی
واردسازی کدگذاری.مقدار

تابع ریشه:
    متن := "name,city\nعلی,تهران\n\"سارا، مهندس\",\"شیراز\"\n"
    ناپایا ج := سی اس وی.خواندن همه(متن)
    سرچاپ ج.ردیف‌ها.طول()
    هر ر در ج.ردیف‌ها:
        سرچاپ ر.خانه‌ها.طول()، ر.خانه‌ها[۰]
    پایان
    سرچاپ سی اس وی.نوشتن همه(ج)
    سی اس وی.آزادسازی جدول(ج)
    سرچاپ سی اس وی.خواندن خط(`a,"b,c",d`)
    ناپایا خانه‌ها := وکتور {} برگردان وکتور<رشته>
    خانه‌ها.بیفزا("ساده")
    خانه‌ها.بیفزا(`با "نقل"`)
    سرچاپ سی اس وی.نوشتن خط(خانه‌ها)
    م := سی اس وی.به مقدار("name,age\nعلی,30\n")
    سرچاپ مقدار.طول آرایه(م)، مقدار.به رشته(مقدار.مقدار کلید(مقدار.عضو آرایه(م، ۰)، "name"))
    سرچاپ سی اس وی.از مقدار(م)
    گ := سی اس وی.گزینه‌های سی اس وی { سرستون = نادرست }
    ب := سی اس وی.به مقدار سفارشی("1,2\n3,4\n"، گ)
    سرچاپ مقدار.طول آرایه(ب)، سی اس وی.از مقدار سفارشی(ب، گ)
پایان
خروجی3 2 name 2 علی 2 سارا، مهندس name,city علی,تهران سارا، مهندس,شیراز ["a", "b,c", "d"] ساده,"با ""نقل""" 1 علی name,age علی,30 2 1,2 3,4

جدول سی اس وی CSVTable

ساختار جدول سی اس وی
یک جدول.
نامانگلیسیگونهتوضیح
ردیف‌هاrowsوکتور<ردیف سی اس وی>ردیف‌ها، از جمله ردیف سرستون؛ خط‌های خالی در آن نیستند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

گزینه‌های سی اس وی CSVOptions

ساختار گزینه‌های سی اس وی
گزینه‌های تبدیل به مقدار و از آن.
نامانگلیسیگونهتوضیح
سرستونheaderمنطقی = درستردیف اول سرستون است؛ پیش‌فرض درست. اگر نادرست باشد، هر ردیف شیئی با کلیدهای col0، col1 و مانند آن می‌شود و از مقدار سفارشی ردیف سرستون نمی‌نویسد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

تابع‌ها

خواندن همه ReadAll

تابع خواندن همه(text: رشته): جدول سی اس وی
همه‌ی متن CSV را به جدول تبدیل می‌کند. پایان خط \n و \r\n هر دو کار می‌کنند و خط‌های خالی رد می‌شوند. نتیجه را با آزادسازی جدول آزاد کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

آزادسازی جدول FreeTable

تابع آزادسازی جدول(t &: جدول سی اس وی)
حافظه‌ی جدول را آزاد می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

نوشتن همه WriteAll

تابع نوشتن همه(table: جدول سی اس وی): رشته
جدول را به متن CSV تبدیل می‌کند، با \r\n میان ردیف‌ها و بی شکستن خط پس از ردیف آخر.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

به مقدار سفارشی ToValueWith

تابع به مقدار سفارشی(text: رشته، opts: گزینه‌های سی اس وی): value.Value
CSV را با گزینه‌های داده‌شده به مقدار تبدیل می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

به مقدار ToValue

تابع به مقدار(text: رشته): value.Value
CSV با سرستون را به آرایه‌ای از شیءها تبدیل می‌کند، یکی برای هر ردیف داده، با مقدارهای رشته‌ای.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

از مقدار سفارشی FromValueWith

تابع از مقدار سفارشی(v: value.Value، opts: گزینه‌های سی اس وی): رشته
آرایه‌ای از شیءها را با گزینه‌های داده‌شده به CSV تبدیل می‌کند. ستون‌ها کلیدهای نخستین شیء‌اند، بی ترتیب ثابت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

از مقدار FromValue

تابع از مقدار(v: value.Value): رشته
آرایه‌ای از شیءها را به CSV با ردیف سرستون تبدیل می‌کند. ترتیب ستون‌ها ثابت نیست؛ وقتی مهم است نوشتن خط را به کار ببرید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

خواندن خط ReadLine

تابع خواندن خط(line: رشته): وکتور<رشته>
یک خط CSV را به خانه‌هایش تقسیم می‌کند و نقل‌قول‌ها و نقل‌قول‌های دوتایی را برمی‌گرداند. فاصله‌ها می‌مانند، و متنی که پس از نقل‌قول پایانی بیاید و ویرگول نباشد کنار گذاشته می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam

نوشتن خط WriteLine

تابع نوشتن خط(fields: وکتور<رشته>): رشته
خانه‌ها را به یک خط CSV تبدیل می‌کند و هر جا لازم باشد نقل‌قول می‌گذارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: encoding-csv-Table.salam