あなたの場合はivoszzさんのアイデアが一番だと思います。データベースと PHP を取得したい場合は、データベース自体にデータを取得する方法が必要になります。これにより、まったく新しいワームの缶が開かれます。確かに、データベース + サーバー側フロントエンドは業界標準ですが、要件に対して大きすぎるように感じます。
単純なテキスト ファイルから読み取ると、JSON を jQuery で表示する方法を簡単に学習できます。このコードを記述する必要があるのは 1 回だけです。
その後、変更があった場合はいつでも、単純なワークフローを使用できます。Excel を使用して、事前に記録された形式を使用してイベントを入力します。次に、Excel ファイルを .csv としてエクスポートします。小さなプログラムを使用して CSV を読み取り、JSON にシリアル化します。出力をサーバー上の所定の場所にコピーします。すべての準備が整いました。
あなたの不在中に他の誰かがサイトを更新しなければならない場合、必要なのは Excel、変換ツール (小さい)、およびサーバーのパスワードだけです。この回答の最後に変換ツールのコードを掲載しています。
または、コードを使用して ASP .NET WebForms プロジェクトを作成することもできます。コードによって作成されたオブジェクトをシリアル化する代わりに、.aspx ページを作成し、サーバー側コードを使用してそのページにデータを表示できます。ただし、これにはいくつかの欠点があります。
- .net Web フォームは JavaScript よりも学習曲線が急勾配であり、結果のコードはおそらくサーバー側のコントロールを使用することになるでしょう。適切な方法を知らない限り、CSS でスタイルを設定するのは困難です。
- 独自のサーバーの代わりに安価なホスティング パッケージを使用している場合は、プロバイダーのサーバーに必要な .net バージョンがあることを確認する必要があります。また、.net Web プロジェクトには通常すべてのライブラリが含まれているため、おそらくより多くのスペースを消費します。
- 入力データの構造がまったく変わらない場合は、コンバーターを一度コンパイルして、それをブラック ボックスとして扱い始めることができます。表示方法の変更は、JSON 読み取りコードで行うことができ、ブラウザーで直接デバッグできます。.net ソリューションの場合、Visual Studio をインストールしておく必要があります。
- .net Web フォームは将来性のあるスキルではありません。Microsoft は、より便利な新しい Web テクノロジである .NET MVC を作成しました。古いテクノロジを今すぐ学習し始めることはお勧めしません。一方、MVC は静的ページと動的ページを簡単に混在させることができないため、既存の静的ページが多数ある場合、このプロジェクトを MVC にすることはお勧めできません。おそらくコンテンツを使用することはできますが、ルーティング システム全体を書き直し、すべての内部リンクを置き換える必要があります。
csv を JSON に変換する C# アプリケーションのコードを次に示します。コンパイルしたら、.exe を csv と同じディレクトリ (DataSource.csv) に配置します。それをダブルクリックします。同じディレクトリに autoOutput.json という名前の新しいファイルが生成されます。.csv ファイルの各行は、event name; venue; date; cost;
フォーマットで構築する必要があります。Excel の の右側にコメントなどを追加できますがcost
、それらは破棄されます。行の順序は関係ありません。イベント名が一意である限り、それで始まるすべての会場と日付はそのイベントに属するものとして解釈されます。イベント名と会場の組み合わせが一意である限り、すべての日付はその会場でのそのイベントに関するものとして解釈されます。
短すぎて読み取れなかった行に関する情報については、私は何もしていません。ファイルに追加するか、その内容を警告と交換できます。次に、変換を行う人は、警告がなくなるまでcsvをいじる必要があります。または、ファイルに残してみても、表示のためにロードするときに無視することができます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web.Script.Serialization;
namespace ElendilEvents2JSON
{
public class Event
{
public String Name { get; set; }
public List<EventInVenue> venues { get; set; }
}
public class EventInVenue
{
public String VenueName { get; set; }
public List<EventInstance> Dates { get; set; }
}
public class EventInstance
{
public String When { get; set; }
public String Cost { get; set; }
}
class Program
{
static void Main(String[] args)
{
//read the file
List<int> unreadable;
List<Event> events = readFile(@".\SourceData.csv", out unreadable);
//write the file using the normal JSON serializer. Will output just everything as a single line. If the data structure is changed, it will output in the new structure.
string autoOutput;
JavaScriptSerializer serializer = new JavaScriptSerializer();
autoOutput = serializer.Serialize(events);
File.WriteAllText(@".\autoOutput.json", autoOutput);
}
public static List<Event> readFile(string path, out List<int> unreadableLines)
{
//get the contents out of the file
var lines = System.IO.File.ReadLines(path);
// split each line into an array of strings
var csv = lines
.Select(line => line.Split(';'))
.ToArray();
//will hold all events
List<Event> events = new List<Event>();
//will hold the numbers of all lines which were OK
List<int> unreadable = new List<int>();
//read each line, if you want to skip header lines, change the zero
for (int lineCounter = 0; lineCounter < csv.Length; lineCounter++)
{
string[] line = csv[lineCounter];
if (line.Length >= 4)
{
string eventName = line[0];
Event currentEvent;
//if we haven't yet created the event, create it now and add it to the dictionary
if (!events.Select(ev => ev.Name).Contains(eventName))
{
currentEvent = new Event { Name = eventName };
//the venues of the new event are still empty
currentEvent.venues = new List<EventInVenue>();
events.Add(currentEvent);
}
else currentEvent = events.Where(ev => ev.Name == eventName).Single();
// the same as above: we have the event now, if the current venue isn't yet on its list, enter it, else use the old one
string venueName = line[1];
EventInVenue currentVenue;
if (!currentEvent.venues.Select(ven => ven.VenueName).Contains(venueName))
{
currentVenue = new EventInVenue { VenueName = venueName };
currentVenue.Dates = new List<EventInstance>();
currentEvent.venues.Add(currentVenue);
}
else currentVenue = currentEvent.venues.Where(ven => ven.VenueName == venueName).Single();
string date = line[2];
string cost = line[3];
EventInstance currentEventInstance = new EventInstance { When = date, Cost = cost };
currentVenue.Dates.Add(currentEventInstance);
}
else
//if the line was too short
unreadable.Add(lineCounter + 1);
}
unreadableLines = unreadable;
return events;
}
}
}